100 likes | 375 Views
Item: 01 – Static factory methods Item: 09 – Override hashCode Item: 17 – Design & document inheritence Item: 25 – Lists over arrays Item: 33 – EnumMap instead of indexing Item: 41 – Overloading Item: 49 – Primitive type over boxed primitive Item: 57 – Exceptions for exceptional use.
E N D
Item: 01 – Static factory methods • Item: 09 – Override hashCode • Item: 17 – Design & document inheritence • Item: 25 – Lists over arrays • Item: 33 – EnumMap instead of indexing • Item: 41 – Overloading • Item: 49 – Primitive type over boxed primitive • Item: 57 – Exceptions for exceptional use Item gennemgang
Considerstaticfactorymethodsinstead of constructors • Public static factory metoder • Returnerer en instans af klassen • Kan bruges som supplement til, eller erstatning for constructors • Fordele • De kan have logiske navne • De behøver ikke at oprette/la ve et nyt objekt af klassen (ulig constructors) • Kan returnerer en hvilken som helst subtype af den egentlige return type • Ulemper • Klassen kan ikke være en supertype hvis den udelukkende har static fectory metoder • De er ikke på samme måde synlige i API dokumentationen som constructors private Gøgler (String navn) { this.navn = navn; } Public static Gøgler getInstance(String navn) [ return instance == null ? Instance = new Gøgler(navn): instance; }
AlwaysoverridehashCodewhenyouoverrideequals public static void main(String[] args) { Map<Person, String> map = new HashMap<Person, String>(); Person p1 = new Person("Mikkel", "Hansen"); map.put(p1, "88888888"); // Printer 88888888 System.out.println(map.get(p1)); // Printer null, hvis hashcode ikke bliver overridet System.out.println(map.get(new Person("Mikkel", "Hansen")));} public int hashCode() { int result = 16; result = 31 * result + (null == firstName ? 0 : firstName.hashCode()); result = 31 * result + (null == lastName ? 0 : lastName.hashCode()); return result;}
Prefer lists to arrays • Arrays • Covariant: Hvis Subersubtype af Super, så er Sub[ ] subtype af Super[ ] • Refied: Kender og gennemtvinger deres element typer ved run-time. • Generics(Lists) • Invariant: For distinktive typer Type1 og Type2 er List<Type1> hverken subtype eller supertype til List<Type2>. • Erasure: Kender og gennemtvinger deres elementer ved compile-time // Fails at runtime! Object[] objectArray = new Long[1]; objectArray[0] = "I don'tfit in"; //ThrowsArrayStoreException // Won'tcompile! List<Object> ol = newArrayList<Long>(); //incompatible types ol.add("I don'tfit in");
Prefer lists to arrays • Ulovlige generic arrays, som alle vil give geenric array creationerror ved compile-time • new List<E> • new List<String>[ ] • new E[ ] • Ulovligt at skabe et generic array, da det ikke er type safe. // Whygeneric array creation is illegal - Won'tcompile! List<String>[] stringLists = newList<String>[1];// (1) List<Integer> intList = Arrays.asList(42);// (2) Object[] objects = stringLists;// (3) objects[0] = intList;// (4) String s = stringLists[0].get(0);// (5)
Useoverloadingjudiciously Fjerner element i set.remove(i) list.remove(i) Fjerner element med indeksering i list.remove((Integer) i) Fjerner element i af type Integer Bare fordi du kan overloade, betyder ikke at du skal Ved brug af overloading sørg for at • ... de overloadedemetoderharforskelligeantalparametre • ... de erumodetagelige for sammetyper • ... de giver sammeresultat
Design and document for inheritanceorelseprohibit it Farlig situation: En metode i klassen bruger en anden metode der kan overrides Ikke altid tydeligt hvordan de forskellige metoder bruger hinanden. • Design og dokumenter: • Thisimplementation…” • Test ved at skrive sub-klasser • Forbyd: • Erklær klassen for ”final” • Lav ”public staticfactories” i stedet for konstruktorer
UseEnumMapinstead of ordinalindexing • Dårligt • Brug ikke et array til at repræsentere Enum typer. • int har ikke den samme type sikkerhed som Enum. • Godt • Brug EnumMap • Er ligeså hurtig som et array • Der indexeres med Enum direkte
Prefer primitive types to boxed primitives Primitive: int, double, long Boxed primitive: Integer, Double, Long Integeri1= newInteger(42); Integeri2 = newInteger(42); Integeri3; booleanb1 = (i1< i2); // false booleanb2= (i1== i2); // false booleanb3= (i3 < 55); // NullPointerException
Useexceptionsonly for exceptionalconditions Exeptions er KUN til exceptionalconditions Brug dem aldrig til at ”optimere”. // Horrible abuse of exceptions. Don't ever do this! try { int i = 0; while(true) range[i++].climb(); } catch (ArrayIndexOutOfBoundsExceptione) { }