Objects First With Java A Practical Introduction Using BlueJ 5. More sophisticated behavior Innehåll Användning av bibliteksklasser Skriva och läsa dokumentation Biblioteksklasser för ökad funktionalitet 2 Javas klassbibliotek Tusentals klasser Många fler metoder Många praktiska klasser redan färdiga Den som vill programmera i Java måste kunna använda biblioteken Arbete med klassbibliotek Du ska: Känna till några viktiga klasser Veta hur man tar reda på information om nya Kom ihåg: Vi behöver bara känna till gränsytan inte implementationen för att använda en klass. 3 4 A Technical Support System Huvudloopens struktur boolean finished = false; Enkelt dialogsystem, helt textbaserat Iden baseras på Eliza (Joseph Weizenbaum MIT, 60-talet) Utforska while(!finished) gör något if(avbrottsvillkor) finished = true; else gör något 5 6 M. Kölling, University of Southern Denmark 1
Huvudloopens kropp Avbrottsvillkoret String response = responder.generateresponse(); System.out.println(response); if(input.startswith()) finished = true; Varifrån kommer startswith? Vad är det och vad gör det? Hur kan vi ta reda på det? 7 8 Att läsa klassdokumentation Gränsyta vs. implementation Dokumentationen av Javabiblioteken är i HTML-format Läses via en webbrowser API: Application Programmers Interface Beskrivning av gränsytan för alla biblioteksklasserna Dokumentationen innehåller Klassens namn En allmän beskrivning av klassen En lista av konstruktorer och metoder Returvärden och parametrar för konstruktorer och metoder En beskrivning av syftet med varje enskild konstruktor och metod klassens gränsyta/interface 9 10 Gränsyta vs. implementation Biblioteksklasser Dokumentationen innehåller inte privata attribut (de flesta) privata metoder Källkoden för metoderna implementation av klassen Biblioteksklasser måste importeras med en särskild import-sats (java.lang importeras automatiskt). Vad ligger i java.lang? Efter att de importerats kan klasserna användas som om de fanns i samma projekt. 11 12 M. Kölling, University of Southern Denmark 2
Paket och import Klasser organiseras i paket/packages Man kan importera en enstaka klass: import java.util.arraylist; Man kan importera hela paketet : import java.util.*; import-satsen ligger först i filen if(input == ) Jämföra String-objekt if(input.equals()) testar identitet testar likhet Objekt av klassen String måste (nästan) alltid jämföras m.h.a. equals 13 14 Identitet vs. likhet 1 Identitet vs. likhet 2 Andra objekt: 37 person1 person2 person1 person2 person1 == person2? person1 == person2? 15 16 Identitet vs. likhet 3 Identitet vs. likhet (String) person1 person2 if(input == ) == testar identitet ==? person1 == person2? input (kan vara) false! 17 18 M. Kölling, University of Southern Denmark 3
Identity vs. equality (String) Klassen Random if(input.equals()) equals testar likhet equals? Biblioteksklassen Random kan ta fram slumptal. Hur? Är det slump? import java.util.random; Random randomgenerator = new Random(); int index1 = randomgenerator.nextint(); int index2 = randomgenerator.nextint(100); input true! 19 20 Slumpmässiga svar Maps public Responder() randomgenerator = new Random(); responses = new ArrayList<String>(); fillresponses(); public String generateresponse() int index = randomgenerator.nextint(responses.size()); return (String) responses.get(index); public void fillresponses() Maps samling för par av värden. Ett par består av en nyckel och ett värde. Man slår upp genom att tillhanda hålla nyckeln och får tillbaka värdet. T.ex. en telefonkatalog. 21 22 Maps - hur? Maps-praktiskt Här är paret (nyckel,värde) två objekt av typen String :HashMap HashMap phonebook = new HashMap(); phonebook.put("charles Nguyen", "(531) 9392 87"); phonebook.put("lisa Jones", "(402) 36 4674"); phonebook.put("william H. Smith", "(998) 5488 0123"); "Charles Nguyen" "(531) 9392 87" "Lisa Jones" "(402) 36 4674" "William H. Smith" "(998) 5488 0123" String number = (String)phoneBook.get("Lisa Jones"); System.out.println(number); 23 24 M. Kölling, University of Southern Denmark 4
Mängder/sets Tokens = grupper av tecken import java.util.hashset; import java.util.iterator; HashSet myset = new HashSet(); myset.add("one"); myset.add("two"); myset.add("three"); Iterator it = myset.iterator(); while(it.hasnext()) anropa it.next() för att få nästa objekt gör något med det objektet Jämför detta med hur vi använde ArrayList public HashSet getinput() System.out.print("> "); String inline = readinputline().trim().tolowercase(); StringTokenizer tokenizer = new StringTokenizer(inLine); HashSet words = new HashSet(); while(tokenizer.hasmoretokens()) words.add(tokenizer.nexttoken()); return words; 25 26 Dokumentation av klasser Dokumentera dina egna klasser på samma sätt som biblioteksklasserna Andra ska kunna använda dina klasser utan att läsa källkoden! Se dina klasser som biblioteksklasser! Komponenter i dokumentationen Dokumentationen bör innehålla: Klassnamnet En kommentar som beskriver det övergripande syftet med klassen och dess karakteristika Ett versionsnummer Konstruktörens namn Dokumentation för varje konstruktor och metod 27 28 Mera i detalj: javadoc För varje enskild konstruktor eller metod: Namnet på metoden returtypen Parametrarnas namn och datatyp Syfte och funktion Beskrivning av varje parameter Beskrivning av returvärdet Klasskommentaren: /** * The Responder class represents a response * generator object. It is used to generate an * automatic response. * * @author Michael Kölling and David J. Barnes * @version 1.0 (1.Feb.2002) */ 29 30 M. Kölling, University of Southern Denmark 5
javadoc public vs private Method comment: /** * Read a line of text from standard input (the text * terminal), and return it as a set of words. * * @param prompt A prompt to print to screen. * @return A set of Strings, where each String is * one of the words typed by the user */ public HashSet getinput(string prompt) Publika storheter (attribut, konstruktorer, metoder) är tillgängliga för andra klasser. Attribut borde inte vara publika Privata attribut är tillgängliga bara inom den egna klassen. Bara metoder som är avsedda för andra ska vara publika. 31 32 Information hiding Klassvariabler Data tillhörande ett objekt döljs för andra objekt. Man vet vad ett objekt kan göra, inte hur det görs. Denna princip ger en högre grad av oberoende. Viktigt för stora system och underhåll. Bra för utveckling och felsökning! är en instans av är en instans av är en instans av 33 34 Konstanter Sammanfattning private static final int GRAVITY = 3; private: modifierare som anger access static: variabel som tillhör klassen En enda som delas av alla objekt final: konstant, kan ej ändras Anges ofta med versaler Java har omfattande klassbibliotek. En programmerare måste kunna använda sig av biblioteksklasser. Dokumentationen visar vad man behöver veta för att använda klassen. Implementationen är dold (information hiding). Vi dokumenterar våra klasser så att gränsytan (javadoc) kan läsas fristående och ge tillräcklig information för den som vill använda klassen. Dessutom dokumenterar vi för underhåll och teknisk förståelse. 35 36 M. Kölling, University of Southern Denmark 6