Applikationsprogrammering i Java 7,5 hp Lektion 1 Personal Kursansvarig, Föreläsare och gruppövningar (johane@cs.umu.se) Handledare Thomas Johansson (thomasj@cs.umu.se) Information Websajt http://www.cs.umu.se/kurser/5dv085/ht10 Nyheter från mig Email Nyhetssidan på sajten Kursens innehåll Det verkliga målet Mera om Javas bibliotek Grafiska gränssnitt Reaktiv programmering Trådar Databaser XML Ni ska ha en uppsättning verktyg som ni kan använda i era fortsatta studier (och även efteråt) Design patterns etc
Vad innebär detta Tyngdpunkten i kursen ligger i att konstruera program Skriva mycket kod Skriva bra kod Vad som krävs av dig Följande krävs av dig: Att du är aktiv Att du lägger ner tid på kursen Att du själv skriver kod Att du själv designar program Fjolårets kursutvärdering Förslag på förändringar: Fundera på att examinera webservice delen genom ett obligatoriskt tillfälle istället för som en del av projektet och ersätta dess del i projektet med en databasdel. Fundera över att göra något för att få till en vi känsla iprojektgrupperna. Se till så att trådsäkerhetsmaterialet gås igenom noggrannare Examination Kursen är uppdelad i 2 moment Teorimoment 3 hp Examineras genom 3h tenta på slutet av kursen Betyg U,3,4,5 Labmoment 4,5 hp Examineras genom ett antal laborationer Betyg U,3,4,5 Totala betyget på kursen blir viktat resultat baserat på momentens betyg Inlämningsuppgifter Krav på inlämningsuppgifterna Lab1 Interspection och GUI-intro. (5p) Enskilt Lab2 XML - RSS-läsare (10p) Enskilt Projekt (10p) I grupper om 4 studenter (ev kan någon grupp bli 5). Grupperna kommer att utses efter att den första labben lämnats in. 3 st redovisningstillfällen 2008-12-16 Milestone. Behöver inte vara fungerande, men ni ska ha kommit en bra bit på vägen (demo av hur det gått hittills/plan för resten av arbetet för handledare) 2008-01-12 Demo av projektet för lärare/handledare och medstudenter 2008-01-12 Inlämning av dokumentation För betyget 3 krävs att alla labbar är godkända Ska lämnas in i tid (planera din tid!) Uppskov beviljas av mig Det räcker inte med att programmet fungerar! Första versionen är den som kommer att poängsättas så se till att anstränga er för att få den så bra som möjligt Vi kommer inte att ge O på labbarna annat än om de funkar väldigt dåligt
Krav på inlämningsuppgifterna Rapporten ska vara klart och tydligt utformat (på svenska eller engelska... inte båda) innehålla en beskrivning av idén som lösningen bygger på innehålla en beskrivning av design/lösning innehålla en översikt av klasserna beskrivning av val, begränsningar, problem, alternativa lösningar Rapporten kommer stå för en inte oansenlig del av poängen på labbarna Krav på inlämningsuppgifterna Kod enl god OO modell Arv där så är lämpligt Interface där så är lämpligt Bedöms efter design, räcker inte med att programmet funkar God standard på koden Koden ska på denna kurs följa SUNs kodstandard Om boken Boken är samma bok som på Javakursen. Vi kommer främst att titta på de mer avancerade kapitlen i boken (se läsanvisningarna) Utöver boken kommer ni tex behöva använda API beskrivningen som finns på nätet i rätt stor utsträckning, samt att vi kommer att komplettera boken med material bland annat från SUNs olika tutorials på nätet. Bibliotek På kursen kommer vi använda en mängd klasser ur javas bibliotek Stort, mycket stort För stort? Portabelt lite beroende på vad man gör hur portabelt det blir Objektorienterat Använder sig i stor grad av Design Patterns Olika programtyper Applikationer (vanliga program) Applets (program för websidor) JavaBeans (komponenter) Servlets (server program för websidor) JSP (annan variant) Enterprise JavaBeans (distribuerad) Java varianter Standard Edition Den "vanliga" varianten Enterprise Edition API, beskrivning Micro Edition Lite resurser
IDE På kursen kommer ni behöva använda er av en riktig fullskale IDE som tex Eclipse då programmen ni skriver kommer att bli lite större och ni kommer behöva det stöd som dessa verktyg ger Introspection Javas förmåga att undersöka sig själv Run-Time Type Info RTTI Kolla vad ett objekt innehåller och vilka egenskaper det har instanceof Class Objekt som skapas av run-time systemet (JVM) Håller reda på informationen om om en klass Class-objekt kan fås fram antingen via ett objekt eller via en klass Class<?> java.lang.object.getclass() Class<?> classolle = olle.getclass() Class<SomeClassName> SomeClassName.class Class<Member> classmember = Member.class Class<?> java.lang.class.forname( x ) Class<?> classmember = java.lang.class.forname ( xfile.member ) Metoder i ett Class<T>-objekt (exempel) String getname() Class<? super T> getsuperclass() boolean isarray() boolean isinstance( Object obj ) boolean isinterface() T newinstance() Jan Erik Moström
public class CreateByName{ public static void main ( String[] args ) { for( int i = 0 ; i < args.length ; i++ ) { try { Class<?> x = Class.forName( args[i] ); Object y; try { if( x.isinterface() ) { System.out.println(args[i] + " är ett interface och inget objekt kan skapas"); else { y = x.newinstance(); if( y instanceof java.awt.component ){ System.out.println( args[i] + " är en GUI komponent"); else { System.out.println( args[i] + " är inte en GUI komponent"); catch( InstantiationException e ) { e.printstacktrace(); catch( IllegalAccessException e ) { e.printstacktrace(); catch( ClassNotFoundException e ) { System.out.println( "Kunde inte hitta " + args[i] ); Class<?> x = Class.forName( args[i] ); Object y; try { if( x.isinterface() ) { System.out.println(args[i] + " är ett interface och inget" + "objekt kan skapas"); else { y = x.newinstance(); if( y instanceof java.awt.component ){ System.out.println( args[i] + " är en GUI komponent"); else { System.out.println( args[i] + " är inte en GUI komponent"); Casting Casting är en annan sak som görs möjlig tack vare RTTI. Säker Osäker Run-time: ClassCastException Reflection API Ger mer detaljer java.lang.reflect.constructor java.lang.reflect.method java.lang.reflect.field java.lang.reflect.array java.lang.reflect.constructor<t> Class<?>[] getparametertypes() T newinstance(object...!initargs) java.lang.reflect.method Class<?>[] getparameterstypes() Class<?> getreturntype() Object invoke(object!obj, Object...!args)
import java.lang.reflect.*; public class ListStringMethods{ public static void main( String[] args ) throws ClassNotFoundException { Method[] ma = String.class.getMethods(); for( int i = 0 ; i < ma.length ; i++ ){ System.out.println( ma[i] ); > java ListStringMethods public int java.lang.string.hashcode() public int java.lang.string.compareto(java.lang.string) public int java.lang.string.compareto(java.lang.object) public boolean java.lang.string.equals(java.lang.object) public int java.lang.string.length() Konstruktorer Initierar ett nytt objekt Kan finnas flera olika - minst en public class Example {!...! public Example() {...! public Example(String s) {...! public Example(int i) {...!... public class Coordinate { private int x; private int y; public Coordinate( Integer x, Integer y ) { this.x = x.intvalue(); this.y = y.intvalue(); import java.lang.reflect.*; public class Demo { public static void main(string[] args) throws java.lang.classnotfoundexception, java.lang.nosuchmethodexception, java.lang.instantiationexception, java.lang.illegalaccessexception, java.lang.reflect.invocationtargetexception { Class<?> c = Class.forName( "Coordinate" ); Class[] p = new Class[2]; p[0] = Integer.class; p[1] = Integer.class; public String tostring() { return "(" + x + "," + y + ")"; Constructor con = c.getconstructor(p); Object[] par = new Object[2]; par[0] = new Integer(12); par[1] = new Integer(34); Object o = con.newinstance(par); System.out.println( o ); Finalize Finalize är en metod som körs när objektet tas bort, kan användas för att rensa upp efter ett objekt. public class Example { Anropas när objektet tas bort Inte säkert att objektet tas bort!!! Man ska aldrig anropa finalize själv!! public Example() { System.out.println("Hello, wonderful world") protected void finalize() throws Throwable { System.out.println("Goodby cruel world");
public class Demo { public static void main(string[] args) { Example eo = new Example(); eo = null; > java Demo Hello, wonderful world > public class Demo { public static void main(string[] args) { Example eo = new Example(); eo = null; System.gc(); System.runFinalization(); > java Demo Hello, wonderful world Goodbye cruel world > Nakdelar med introspection/reflection Tänk på att introspection och reflection är lite av nödlösningar som bör användas bara när man måste Situationer med instanceof kan ofta lösas med polymorfism tex GUI-intro Anledningar att inte använda reflection Långsamt Ger access till interna implementationsdetaljer (tex medlemmar deklarerade privat) och kringgår därigenom inkapsling Målet Användaren - ge användaren ett sätt att mata in information Systemet - göra det möjligt att använda ett GUI för att presentera information Historia Java 1.0 - AWT Java 1.1 - AWT java.awt Swing - först separat nerladdning Swing - sedan en del av standarddistributionen (Java 1.2) javax.swing
Principer - händelsestyrt Ditt program Javas runtime Användaren Händelsestyrt Princip Programmet sitter och rullar tummarna Användaren gör nåt JVM/JFC genererar en eller flera händelser och skickar dessa till ditt program Programmet hoppar upp, gör något snabbt och fortsätter sedan att rulla tummarna. Begrepp Components - basen för de andra klasserna (knappar, listor, etc) Controls - knappar, listor, etc Containers - kan innehålla andra komponenter LayoutManager - sköter placeringen av olika GUI komponenter MVC Model-View-Controller Förändringar View Logiken (modellen) Model Utseende Kontrolldel Hämtar data Håll de olika delarna i Händelser applikationen separata Uppdaterar Controller Modellen ska inte behöva känna till gränssnittet Varje del kan (självklart) bestå av flera klasser i ett program Delegate I java slår man ibland ihop view och controller till en enhet, en delegate View Model Controller delegate Jan Erik Moström
Hur funkar det? Swing addxxxxlistener XXXXListener interface JFrame JPanel JPanel private JPanel private JPanel private JPanel upperpanel; middlepanel; lowerpanel; public ThreePanels( String title ) { super( title ); Container cp = getcontentpane(); JTextField setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); JButton JButton JButton upperpanel = new JPanel(); cp.add( upperpanel, BorderLayout.NORTH ); middlepanel = new JPanel( ); cp.add( middlepanel, BorderLayout.CENTER ); JPanel lowerpanel = new JPanel( ); cp.add( lowerpanel, BorderLayout.SOUTH ); JPanel JCheckBox pack(); setvisible(true); BorderLayout North JUnit West Center East South
JUnit Unit testing för java Används för att testa att metoder/klasser beter sig som det var tänkt Många IDE:er tex Eclipse har inbyggt stöd för detta. JUnit 3 Vi skriver testklasser och låter dessa ärva från junit.framework.testcase. (JUnit klasserna måste läggas till till projektet då dessa klasser inte är med bland standardklasserna i java) Namnge testmetoderna med test som prefix (det är så de känns igen som testmetoder) Undersök de villkor som ska testas mha de olika assert-metoderna i TestCase Kör testen mha Run -> Run -> JUnit i Eclipse (Se till så att ni ställt in den på att använda version 3) JUnit 3 forts. Ibland vill man göra grundinställningar som ska göras innan varje test. Dessa kan göras i metoden protected void setup() som körs innan varje test i den klassen Behöver man städa upp efter testen görs detta i metoden protected void teardown() som anropas automatiskt efter varje test. Villkorskontroller i test Statiska metoder som finns definierade i Klassen Assert (TestCase ärver från denna) asserttrue assertfalse assertnull assertnotnull assertequals Kontrollerar om två värden är lika. För objekt kontrolleras detta mha deras equals-metod. assertsame Kontrollerar om två referenser är lika assertnotsame fail() Misslyckas alltid Exempel JUnit3 import junit.framework.testcase; public class PolynomTest extends TestCase { public void testcreateobject() { double d[]={1.0,2.0; Polynom p=new Polynom(d); assertnotnull(p); JUnit 4 Version 4 Vi behöver ej utnyttja arv Testmetoder indikeras mha att vi annoterar dem med @Test Till Test-annotationen kan man även specificera om vi vill att ngt särskilt undantag ska kastas @Test(expected=IndexOutOfBoundsException.class) public void outofbounds() { new ArrayList<Object>().get(1); eller sätta en tidsgräns för testet @Test(timeout=100) Här 100 millisekunder Använd assert-metoderna för att testa villkoren (samma som i JUnit 3) Ett lätt sätt att använda assert-metoderna (eftersom de nu inte är tillgängliga via arv) är att göra en static import från Assert-klassen
Static imports public class Demo7 { public static void main( String[] argv ) { System.out.println( 2 * Math.PI ); Bra? Nja... Kräver viss försiktighet import static java.lang.math.pi; public class Demo7 { public static void main( String[] argv ) { System.out.println( 2 * PI ); Exempel med JUnit4 import org.junit.test; import static junit.framework.assert.assertnotnull; public class JUnit4TestClass { @Test public void createobject() { double d[]={1.0,2.0; Polynom p=new Polynom(d); assertnotnull(p); Nested & Inner Classes