Avansert bruk av Eclipse - Eclipsekurs fra Mesan

Like dokumenter
Repitisjonskurs. Arv, Subklasser og Grensesnitt

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Løsningsforslag Test 2

Verden - Del 2. Steg 0: Oppsummering fra introduksjonsoppgaven. Intro

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

Verden. Steg 1: Vinduet. Introduksjon

2 Om statiske variable/konstanter og statiske metoder.

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

UNIVERSITETET I OSLO

Steg 1: Sette opp Java-prosjekt, og lage app-mappe og app-klasse

INF Notater. Veronika Heimsbakk 10. juni 2012

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java

UNIVERSITETET I OSLO

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

Generiske mekanismer i statisk typede programmeringsspråk

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

Verden. Introduksjon. Skrevet av: Kine Gjerstad Eide og Ruben Gjerstad Eide

1. NetBeans IDE: Lage en enkel mobilapplikasjon

Kapittel 7: Mer om arv

Læringsmål for forelesningen

Introduksjon til objektorientert programmering

INF Innleveringsoppgave 6

Obligatorisk oppgave 1 INF1020 h2005

Kom forberedt til tirsdag. INF1000 Tips til obligatorisk oppgave 4. Noen generelle tips. Oblig4: Komme igang

JAVA Oppsummering for IS-102. Even Åby Larsen

Løse reelle problemer

Enkle generiske klasser i Java

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Arv. Book book1 = new Book(); book1. title = "Sofies verden" class Book { String title; } class Dictiona ry extends Book {

Et større programeksempel. Hvordan løse et reelt problem med en objektorientert fremgangsmåte

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Communicate SymWriter: R1 Lage en tavle

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Vi har en plan. Om Mesan. Hva vil det si å jobbe i Mesan. Eclipsekurs Vi rekrutterer. Hvem vi er Hva jobber vi med

Steg 1: Lag bildedeklarasjon

En liten oppskrift på hvordan jeg installert og fikk Xastir til å virke sånn at jeg ble synlig i APRS verden.

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Java fra Eclipse til Evalanche

UNIVERSITETET I OSLO

NB!!! Veldig korte svar er gitt her. Disse burde det vært skrevet mer på ved en eksamen..

Kapittel 8: Programutvikling

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

INF1000 HashMap. Marit Nybakken 2. november 2003

Kanter, kanter, mange mangekanter. Introduksjon: Steg 1: Enkle firkanter. Sjekkliste. Skrevet av: Sigmund Hansen

Flytte innhold fra Fronter til Canvas

Obligatorisk oppgave 4: Lege/Resept

Diverse eksamensgaver

Verden - Del 2. Intro. Skrevet av: Kine Gjerstad Eide

Løse reelle problemer

INF1010, 15. januar time. Parametriserte klasser (generiske klasser) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

Det du skal gjøre i denne oppgava er først å sette opp bakgrunnen til spillet og så rett og slett å få firkanter til å falle over skjermen.

INF1000 Mer om objekter

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Programmering i C++ Løsningsforslag Eksamen høsten 2005

For å sjekke at Python virker som det skal begynner vi med å lage et kjempeenkelt program. Vi vil bare skrive en enkel hilsen på skjermen.

Oppgavesett for NVivo 9

Tryll bort heksa. Introduksjon. Sjekkliste Følg instruksjonene på lista. Huk av etter hvert. Test. Lagre 2/8

Excel. Kursopplegg for SKUP-skolen 2010

Tetris. Introduksjon. Skrevet av: Kine Gjerstad Eide. Lag starten på ditt eget tetris spill!

2 Om statiske variable/konstanter og statiske metoder.

Program delegate. Lage et nytt prosjekt i Visual Studio

Stein Gjessing. Institutt for informatikk. Universitetet i Oslo. Institutt for informatikk

INF1010 våren Grensesnitt

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

IN våren 2018 Tirsdag 16. januar

IN våren 2019 Onsdag 16. januar

UNIVERSITETET I OSLO

INF1000 Metoder. Marit Nybakken 16. februar 2004

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

Verdens korteste grunnkurs i Excel (2007-versjonen)

Kanter, kanter, mange mangekanter

INF1010 notat: Binærsøking og quicksort

Tegneprogram Journeyman Scratch PDF

INF Uke 10. Ukesoppgaver oktober 2012

Her skal du lære å programmere micro:biten slik at du kan spille stein, saks, papir med den eller mot den.

TOD063 Datastrukturer og algoritmer

Innhold uke 7. Objektorientert programmering i Python: Introduksjon. Lite tilbakeblikk: Programflyt og skop. Lite tilbakeblikk: Funksjoner er uttrykk

Test 2 OOP. - Prøveeksamen

Oblig 4 (av 4) INF1000, høsten 2009 Værdata, leveres innen 6. nov. kl

INF Repetisjon: Hvordan bygge treet og analysere? 8. september Typisk situasjon. De problematiske syntaks-diagrammene

Steg 1: Hvordan styre figurer med piltastene

IN1010 våren januar. Objektorientering i Java

ToPlayer. Steg 1: Kom i gang med metodene setup og draw. Gjør dette: Introduksjon:

Øvingsforelesning TDT4105

Telle i kor steg på 120 frå 120

Excel. Kursopplegg for SKUP-konferansen Laget av

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

MathType. En innføring

VEILEDNING FOR INSTALLASJON AV SIGNALOPPSETT I AUTOCAD

Emnenavn: Objektorientert programmering. Faglærer: Lars Emil Knudsen

Debugging. Tore Berg Hansen, TISIP

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

Algoritmer og datastrukturer Eksamen

INF Seminaroppgaver til uke 3

Transkript:

Avansert bruk av Eclipse - Eclipsekurs fra Mesan Refactoring i fellesskap Utgangspunktet Om refactoring i Eclipse Gjennomføring Kildekoden Kjør! Myk intro - Rename Oops - sjekk kommentarer Siden vi er inne på det - Change Method Signature Endring av klassenavn Hvileskjær Alt i ett - Introduce Parameter Object Ekte innkapsling - Encapsulate Field Uforanderlig - Inline Skjerpings - Extract Interface Langsomt, skyndsomt - Extract Class Frikobling - Introduce Parameter, Use Supertype Where Possible, Introduce Factory Restopplag Eksemplarisk - Extract Local Variable Videre forfremmelse - Convert Local Variable to Field Halvparten av dobbelt - Inline Lastenes sum er - Extract Constant Generalisme i praksis - Generalize Declared Type Extract Method Videre? Utgangspunktet Support International har hatt inne en hospitant fra Faulty Software som har laget en bakgrunnsjobb for å følge opp purring på saker. Den funker i og for seg fint, men når vi nå skal lage den nye jobben for utdatering av foreldede saker over samme lest, oppdager vi jo fort at eksisterende kode ikke helt kvalifiserer som clean... Se BatchResult.java og tro på det du hører...

Ved siden av den grusomme målklassen finner du

1. 2. 3. PurreJobb dette er "klienten" som bruker klassen. Den simulerer en kjøring med et antall produsenter og konsumenter som kommuniserer via en kø. Vi skal ikke bruke mye tid inne i denne det aller meste av endringer i denne bør skje automatisk som følge av refactorings. PurreJobbSystemTest en tung test som kjører hele jobben (plussminus 5 sekunder), og sjekker at totalresultatet blir som forventet. Ved siden av å få hakket renere kode, har vi noen absolutte mål for forbedringen av gørra. Vi ønsker å skille jobbkontrolldelen fra telling/rapportering. Vi ønsker å kunne styre rapportering og output friere ikke være låst til et hardkodet format til en tekstfil med magisk navn. Og ikke minst ønsker vi å skille ut det som er spesifikt for akkurat denne jobben (og det er nesten bare sakstelleren) fra det som er generelt. I tillegg er det hardkodet at det skal være en primærjobb med 2 understeg ( public static final int ANTALL_STEG= 2+1; ) vi vil gjerne kunne dele opp i vesentlig flere steg enn det. Om refactoring i Eclipse Vi skal jobbe oss gjennom noen av valgene på menyen Refactoring i Eclipse. Den menyen er fast du får en mer konteksttilpasset (duh) utgave ved å høyreklikke og se på refactoring på kontekstmenyen lett tilgjengelig med *Alt+Shift+T, den viser generelt bare valg som passer til det du har merket (figuren viser resultatet av å merke navnet på en klasse). Gjennomføring Etter hvert steg i gjennomgangen skal vi kjøre gjennom testen(e) for å sjekke at alt fortsatt virker. Det er jo tanken bak "refactoring" å endre "utseende" uten å endre oppførsel... Ta gjerne en kikk på JavaDoc, formatering etc etter hver refactoring, det har en tendens til å krølle seg litt, særlig når man gjør flere steg og koden er ikke-kompilerbar deler av tiden. Alle referanser under gjelder klassen som (i hvert fall foreløpig) heter BatchResult, så fremt annet ikke er sagt dog vil vi etter hvert gjøre denne uinteressant. Kildekoden For å komme fort i gang ligger utgangspunktet for oppgaven som ZIP-fil her: refactoring-utgangspunkt.zip Løsningsforslag finnes her: V0_1.zip Kjør! Vi skal ta de første stegene mot en ny og bedre verden... Myk intro Rename I kildekodemappen src/main/java ligger pakken no.way. Dette var kanskje ikke noe slående pakkenavn. Vi skal flytte oss under no.support (troll i ord?) og dermed omdøpe pakken til no.support.batch.purring.

1. Merk pakken i Project Explorer, velg Rename fra menyen Refactoring. 2. Eller trykk ( F2 eller) Alt+Shift+R etter å ha merket pakken man trenger jo egentlig ikke å rote i menyer for alt... Helt magisk skal nå package være riktig i Javafilene. Men vi får en kompileringsfeil i kildekodemappen src/test/java der testen er plassert. Gjør den samme tilpasningen på pakkenavnet og kompileringsfeilen skal være rettet Det er mer enn klasser som kan omdøpes. I klassen BatchResult ønsker vi å endre to metoder. Begge metodene er en del av implementasjon av interfacet ResultCounter. 1. Først endrer vi metoden addok som har et litt misvisende navn den var kanskje tenkt å telle antall OK, men teller i praksis antall forekomster behandlet. Så da bør jo metodenavnet avspeile virkelighet vi endrer navnet til inctotal. 2. Gå til ResultCounter og se at metodenavnet er endret også her. 3. Når vi først er i interfacet så kan vi gjøre tilsvarende endring for metoden getok som vi endrer til gettotal. 4. Gå tilbake til BatchResult og se at endringen også er kommet med her. Dobbeltklikk på metodenavnet, trykk Alt+Shift+R, skriv inn 'inctotal'. OK, og ferdig med den. Det kan hende (avhenger av oppsett) du ikke får opp en dialogboks, men at navnet blir merket, og får en ramme rundt seg. Du kan skrive inn det nye navnet direkte inne i rammen, og trykke Enter når du er ferdig, eller du kan trykke nedtrekkspilen og be om å få dialogboksen (du trenger ofte ikke den til hverdags). Gjør ditto for getok. Vitsen med å bruke en refactoring i stedet for bare å skrive inn nytt navn, er selvfølgelig at vi da også endrer navnet i kallende klasser. For å gjøre dette (over)tydelig, kan vi også omdøpe en variabel i klassen BatchCounter fra counter til total.

Dobbeltklikk på variabelnavnet, trykk Alt+Shift+R, skriv inn 'total'. OK, og ferdig Oops sjekk kommentarer Ta en kikk på metodekommentaren for inctotal etter at vi byttet navn. Naturlig nok fikser ikke refactoring på prosa vi må skrive om Tell opp antall OK på egenhånd (nå). Og det gjelder generelt kikk på kommentarer før/etter refactoring, de kommer fort i utakt. Siden vi er inne på det Change Method Signature Kikk enda en gang på inctotal. Den tar to nokså anonyme int som parameter gjett hvor mange som kommer til å lure på hvilken som er stegnummer og hvilken som er antall (eller enda skumlere gjette feil). En kjapp analyse (dobbeltklikk på metodenavnet, trykk Ctrl+Shift+G sjekk referansene som dukker opp i søkevinduet) viser at alle som kaller på denne nå har 1 som antall. Så kanskje er det litt YAGNI å kunne angi antall la oss gå ut fra at den alltid kalles med 1 og heller utsette problemet til en gang noen får behov for bulkoppdatering (kanskje vi rekker å se på det etterpå). Så vi vil ta ta bort parameter nummer 2, antall, fra metoden. Go!

1. Dobbeltklikk på metodenavnet, trykk Alt+Shift+C (eller velg Refactor>Change Method Signature). NB: Hvis du akkurat har brukt Ctrl+Shift+G, kan det være Eclipse tror du vil jobbe med markert treff i søkeresultatet i stedet for i editoren dobbeltsjekk at du prøver å endre riktig "ting". Dette gjelder alle refactorings, og er lett å bomme på... 2. Svar ja på spørsmålet om at det er greit å gjennomføre operasjonen på denne metoden. Den informerer om at metoden er en implementasjon av interfacet ResultCounter. 3. Marker parameter nr. 2, og trykk Remove. 4. Du vil få en stygg advarsel, men det er greit, vi skal fikse på resultatet det er ikke alltid refactoring er 100% automatisk... 5. Vi får kompileringsfeil på addandget(pantall) endre dette til incrementandget(), så blir det bra. Endring av klassenavn Vi har en klasse med et misvisende navn. Dette henger igjen fra en tidligere refaktoreringsjobb som ikke ble ferdigstilt. Omdøp klassen OpptellingOgStyringOgRapporteringForStatusJobb til PurreJobbResultat. Heretter vil vi jobbe mest i no.support.batch.batchresult, ta det som default, så fremt annet ikke er nevnt. Hvileskjær Vi har jobbet hardt nok en stund la oss ta et par enkle... Alt i ett Introduce Parameter Object Let deg frem til report-metoden i BatchResult. Den har 6 strenger som parametere, og trenger åpenbart litt hjelp. Det er rimelig å tro at de 6 strengene tilsvarer hhv venstre, senter og høyre oppe og nede, men detaljene sparer vi til senere. I første omgang lager vi bare en klasse DocumentHeaderFooter som kan innkapsle disse den skal foreløpig ikke ha gettere og settere, bare 6 public String (så kan vi trene på get/set i neste avsnitt).

1. 2. Dobbeltklikk på metodenavnet, velg Refactor>Introduce Parameter Object. Angi DocumentHeaderFooter som navn på en toppnivåklasse, fjern krysset på gettere og settere. Ekte innkapsling Encapsulate Field Vi angrer selvfølgelig umiddelbart på at vi ikke lagde gettere og settere i forrige punkt det var jo et helt kunstig påfunn. Gå inn i den nye klassen DocumentHeaderFooter, og gjør om de 6 strengene til private felter med gettere og settere.

For hvert av feltene merk feltet og velg Refactor>Encapsulate Field. Forskjellen på å bruke Encapsulate Field og Source>Generate Getters and Setters er at sistnevnte generelt ikke fikser på eksisterende tilganger (men til gjengjeld kan den ta mange av gangen). Uforanderlig Inline Men egentlig vil vi jo gjerne ha et immutable verdiobjekt som konstrueres ferdig i constructoren. Så ved nærmere ettertanke kan du inline alle setterne (så fremt du ikke parprogrammerer med en villmann, er disse nemlig bare i bruk i constructoren). For hver av setxxx-metodene, merk navnet og trykk Alt+Shift+I ( Refactor>Inline). Skjerpings Extract Interface Nå har vi tatt det for rolig for lenge... Videre med forretningsmålene. Nå vil vi trekke ut et interface for jobbstyringen det er typisk de trådorienterte metodene threadsup(), threadsdown(), getthreadcount(), stepdone() vi ønsker å skille ut i et interface ThreadControl.

1. 2. Plasser markøren i BatchResult og velg Refactor>Extract Interface Marker de 4 nevnte metodene, pass på at det er krysset av for å benytte Interfacet der mulig. 3. Rydd i JavaDoc, @Override etc Langsomt, skyndsomt Extract Class Da har vi grensesnittet, men vi ønsker jo å få ut funksjonaliteten også. Flytt over threadstarted og threadcounter i en egen klasse BatchControl. Denne klassen skal implementere ThreadControl. Denne metoden er ikke spesielt vakker. Ville nok gjort litt mer manuelt hvis ikke poenget var å prøve ut refactorings...

1. 2. 3. Klipp ut de 4 metodene som utgjør ThreadControl i BatchResult ut på et trygt sted f.eks. Notepad Bli stående i BatchResult, og velg Refactor>Extract Class Marker de to feltene threadstarted og threadcounter, og be om ikke å få gettere/settere, angi navnet BatchControl for klassen, og batchcontrol for variabelen (nederst). 4. 5. Men den implementasjonen ble kanskje ikke så vakker. Flytt opprettelsen av BatchControl (dvs = new BatchControl() ) fra deklarasjonen til constructoren, og send med step som parameter (bruk QuickFix for å få den på plass). Gjør feltene i BatchControl om til private final, og flytt over opprettelsen av de enkelte variablene til constructoren. Du bør da ende med en constructor som ser slik ut: BatchControl.BatchControl() public BatchControl( final int step) { this.threadcounter= new AtomicInteger[step]; this.threadstarted= new boolean[step]; for ( int i=0; i< step; i++) { this.threadcounter[i]= new AtomicInteger(); } } 6. 7. 8. Legg til implements ThreadControl, og lim inn metodene slik de tidligere lå i BatchResult. Gå til BatchResult, og endre typen på variabelen batchcontrol til ThreadControl. Marker variabelen batchcontrol, og velg Source>Generate Delegate Methods, rydd gjerne i resultatet.

Nytt designmål nådd vi har fristilt trådstyringen Frikobling Introduce Parameter, Use Supertype Where Possible, Introduce Factory Det er alt for mye new i denne koden. Marker hver av new BatchControl, new BatchLogger og new BatchCounter i constructoren i BatchResult, og bruk Introduce Parameter på dem. Pass på å merke hele teksten, f.eks for BatchCounter så merk new BatchCounter(step). Dersom du får kompileringsfeil i constructoren i PurreJobbResultat, så klarer du sikkert å fikse på dem også. Av en eller en annen grunn insisterer Eclipse på å bruke typen til objektet (f.eks. BatchControl) i stedet for typen til variabelen som skal inneholde den (f.eks. ThreadControl). Dette fikser vi ved å gå inn i hver av klassene BatchControl, BatchCounter og BatchLogger, og velge Refactor>Use Supertype Where Possible. Merk de respektive interfacene, og så hvordan constructoren langsom får en penere argumentliste. Så oppretter vi en ny klasse ResultFactory i en ny pakke no.support.batch.factory, hvoretter vi markerer constructoren i PurreJobbResultat og kjører Refactor>Introduce Factory. Kall metoden createresult (vi skal fikse litt på den), og legg den i no.support.batch.factory.resultfactory, men ikke be om privat constructor. Pynt gjerne litt på resultatet, men først og fremst gjør vi om til følgende metode denne er ikke ment å leve lenge: @SuppressWarnings("unchecked") public static <T extends BatchResult> T createresult( final Class<? extends T> clazz, final boolean debug) { if ( clazz.isassignablefrom(purrejobbresultat.class)) { return (T) new PurreJobbResultat(debug); } return null; } Restopplag Vi brenner nå etter å gå løs på report-metoden, men det får vente litt vi har et pensum å leve opp til. Eksemplarisk Extract Local Variable er den første på listen. Den kan man jo bruke i et kjør mens man skriver kode, men vi må straks lete litt for å finne et eksempel.

Vi kan begynne med bunnen av BatchResult.report() der finner vi den enkle kodelinjen save(new File(("statusfix." + new SimpleDateFormat("yyMMdd-HHmmss").format(new Date()) + ".log"))); her bør det være mulig å trekke ut 2 variable i trekk: begynn med å lage en String av strenguttrykket fra "statusfix" til ".log". Deretter kan vi lage en File av det som gjenstår. Det virker kanskje overflødig, men det koster ingenting runtime, en som debugger vil kanskje takke deg, og syntaksen blir tydeligere. 1. Merk koden fra første fnutt i "statusfix" til siste fnutt i ".log" (Eclipse er ganskje kjip på riktig merking), og trykk Alt+Shift+L ( Refactor>Extract Local Variable). Kall strengen filename. 2. Merk new File(fileName, og trekk ut denne også. Videre forfremmelse Convert Local Variable to Field Det er en uskikk å hardkode filnavn og særlig til ufortsigbare navn som "statusfix.091126-164822.log". Så vi ønsker å forfremme filnavnvariabelen fra forrige avsnitt til et felt logfilename i klassen, med get/set-metoder, så får heller den rare verdien få lov til å være default. Fix, please. 1. Merk den nye variabelen filename, og velg Refactor>Convert Local Variable to Field, og be om verdisetting allerede i deklarasjonen. Endre navnet samtidig. 2. Merk det nye feltet, og velg Source>Generate Getters and Setters for å la den bli en konfigurerbar public property. Halvparten av dobbelt Inline Refactoringen Inline kan brukes både på metoder og felt, og kan tidvis være grei for f.eks. å kvitte seg med variable som bare brukes én gang (når innholdet er like beskrivende som variabelnavnet+typen). Vi har så vidt brukt den over, men kan trene litt til på BatchResult.TOM_STRENG, som bare peker videre på EMPTY_STRING. Hvis vi inliner TOM_STRENG, benyttes EMPTY_STRING over alt. Merk TOM_STRENG, og velg Alt+Shift+I ( Refactor>Inline). Lastenes sum er Extract Constant Gå til metoden BatchResult.writeData. Der benyttes \n og \t som konstanter. Vi har i første omgang lyst til å gjøre disse til konstanter hhv LINE_SEP og FIELD_SEP. Skulle det bli god tid, kan du kanskje gjøre mer med disse (kikk i DocumentTable...), men i første rekke trekker vi ut disse som symbolske navn på hhv "ny linje" og "ny kolonne/felt".

Merk '\t', velg Refactor>Extract Constant, kall den FIELD_SEP, gjør den public, og kryss av for "Replace all" (men ikke "Qualify"). Gjenta det samme for '\n'. Generalisme i praksis Generalize Declared Type I toppen av BatchLogger finner du, om du har fulgt oppskriftene og ikke vært for flink, deklarasjonen private final LinkedList<String> messages= new LinkedList<String>(). Det er dårlig praksis å benytte mer konkrete typer i deklarasjoner enn du trenger, og collections av ymse slag er et typisk eksempel. Vi ønsker å gjøre om deklarasjonen (på venstre side av likhetstegnet) til en mest mulig generisk type (nei, jeg mener ikke Object...). Merk variabelen, velg Refactor>Generalize Declared Type. Eclipse foreslår noen muligheter, men fokuserer på List<String> gå for den! Extract Method 1. 2. Gå til metoden debug og marker koden som vist på skjermbildet under. Trykk Ctrl + Shift + M og gi den nye metoden et passende navn. Metoden skal være privat.

Videre? Per nå ser det omtrent ut som følger dersom du har fulgt opp alle oppfordringene: