prezentace k Java puzzles
Transkript
prezentace k Java puzzles
CZJUG Java puzzles – Říjen 2006 Roman Pichlík (http://sweb.cz/pichlik) CZJUG http://java.cz #1 Statické metody 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 class Dog { public static void bark() { System.out.print("woof "); } } class Basenji extends Dog { public static void bark() { } } public class Bark { public static void main(String args[]) { Dog woofer = new Dog(); Dog nipper = new Basenji(); woofer.bark(); nipper.bark(); } } CZJUG http://java.cz #1 Statické metody Co se objeví na výstupu? (a) woof (b) woof woof (c) různě CZJUG http://java.cz #1 Statické metody Co se objeví na výstupu? (a) woof (b) woof woof (c) různě CZJUG http://java.cz #1 Statické metody Ještě jednou a detailněji 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 class Dog { public static void bark() { System.out.print("woof "); } } class Basenji extends Dog { public static void bark() { } } public class Bark { public static void main(String args[]) { Dog woofer = new Dog(); Dog nipper = new Basenji(); woofer.bark(); nipper.bark(); } } CZJUG http://java.cz #1 Statické metody Jak to opravit? • Odstraníme klíčové slovo static ze signatury metody bark CZJUG http://java.cz #1 Statické metody Ponaučení • Statické metody nemohou být překryty, náleží vždy k dané třídě a nikoliv k instanci objektu • Nikdy nevolejte statické metody na instancích (toto pravidlo si pokud možno nastavte na úrovni kompilátoru v IDE) – – NE Instance.staticMethod() ANO Class.staticMethod() CZJUG http://java.cz #2 Hrátky s kolekcemi 01 public class Name { 02 private String first, last; 03 public Name(String first, String last) { 04 this.first = first; 05 this.last = last; 06 } 07 public boolean equals(Object o) { 08 if (!(o instanceof Name)) return false; 09 Name n = (Name)o; 10 return n.first.equals(first) && 11 n.last.equals(last); 12 } 13 public static void main(String[] args) { 14 Set s = new HashSet(); 15 s.add(new Name("Donald", "Duck")); 16 System.out.println( 17 s.contains(new Name("Donald", "Duck"))); 18 } 19 } CZJUG http://java.cz #2 Hrátky s kolekcemi Co se objeví na výstupu? (a) true (b) false (c) různě CZJUG http://java.cz #2 Hrátky s kolekcemi Co se objeví na výstupu? (a) true (b) false (c) různě Donald je sice v objektu Set, ale protože porušuje kontrakt metody hashCode, Set jej nemůže najít. CZJUG http://java.cz #2 Hrátky s kolekcemi Ještě jednou a detailněji 01 public class Name { 02 private String first, last; 03 public Name(String first, String last) { 04 this.first = first; 05 this.last = last; 06 } 07 public boolean equals(Object o) { 08 if (!(o instanceof Name)) return false; 09 Name n = (Name)o; 10 return n.first.equals(first) && 11 n.last.equals(last); 12 } 13 public static void main(String[] args) { 14 Set s = new HashSet(); 15 s.add(new Name("Donald", "Duck")); 16 System.out.println( 17 s.contains(new Name("Donald", "Duck"))); 18 } 19 } CZJUG http://java.cz #2 Hrátky s kolekcemi Jak to opravit? • Přidáme implementaci metody hashCode public int hashCode() { return 31 * first.hashCode() + last.hashCode(); } CZJUG http://java.cz #2 Hrátky s kolekcemi Ponaučení • Pokud překrýváte metodu equals, překryjte vždy i hashCode a naopak • Dodržujte kontrakty metod, pokud je překrýváte • Přečtěte si kapitolu 3 v knize Java Efektivně od Joshuy Blocha CZJUG http://java.cz #3 Řadíš, řadím, řadíme 01 public class SordidSort { 02 public static void main(String args[]) { 03 Integer big = new Integer( 2000000000); 04 Integer small = new Integer(-2000000000); 05 Integer zero = new Integer(0); 06 Integer[] a = new Integer[] {big, small, zero}; 07 Arrays.sort(a, new Comparator() { 08 public int compare(Object o1, Object o2) { 09 return ((Integer)o2).intValue() 10 ((Integer)o1).intValue(); 11 } 12 }); 13 System.out.println(Arrays.asList(a)); 14 } 15 } CZJUG http://java.cz #3 Řadíš, řadím, řadíme Co se objeví na výstupu? (a) [-2000000000, 0, 2000000000] (b) [2000000000, 0, -2000000000] (c) [-2000000000, 2000000000, 0] (d) různě CZJUG http://java.cz #3 Řadíš, řadím, řadíme Co se objeví na výstupu? (a) [-2000000000, 0, 2000000000] (b) [2000000000, 0, -2000000000] (c) [-2000000000, 2000000000, 0] (d) různě (chování je nedefinované) Komparátor je špatný! • Spoléhá na odečítání dvou datových typů int • Datový typ int má malý rozsah pro výsledek odečtení dvou typů int CZJUG http://java.cz #3 Řadíš, řadím, řadíme Ještě jednou a detailněji 01 public class SordidSort { 02 public static void main(String args[]) { 03 Integer big = new Integer( 2000000000); 04 Integer small = new Integer(-2000000000); 05 Integer zero = new Integer(0); 06 Integer[] a = new Integer[] {big, small, zero}; 07 Arrays.sort(a, new Comparator() { 08 public int compare(Object o1, Object o2) { 09 return ((Integer)o2).intValue() 10 ((Integer)o1).intValue(); 11 } 12 }); 13 System.out.println(Arrays.asList(a)); 14 } 15 } CZJUG http://java.cz #3 Řadíš, řadím, řadíme Jak to opravit • Změnit implementaci pro porovnání 01 02 03 04 05 06 public int compare(Object o1, Object o2) { int i1 = ((Integer)o1).intValue(); int i2 = ((Integer)o2).intValue(); return (i2 < i1 ? -1 : (i2 == i1 ? 0 : 1)); } CZJUG http://java.cz #3 Řadíš, řadím, řadíme Ponaučení • Int ma určitý rozsah • Nezapomínejte na přetečení • Technika odečítání by mohla fungovat pouze za následujícího předpokladu – – max - min <= Integer.MAX_VALUE napřiklad: pokud jsou všechny hodnoty kladné • Nesnažte se být při psaní kódu “papežtější než Papež” CZJUG http://java.cz Zdroje ● Effective Java (v českém vydání jako Java efektivně) CZJUG http://java.cz Zdroje Java Puzzlers • 95 Puzzles • 52 Illusions • Tons of fun CZJUG http://java.cz Zdroje Zajímavé puzzles můžete poslat na ● [email protected] CZJUG http://java.cz
Podobné dokumenty
studijní text
Traceback (most recent call last)
Spring framework 2.0
Možnost volby implementace (EJB, POJO) business vrstvy pro aplikační
architekturu a ne naopak (tedy aby architektura předepisovala implementaci).
AIDS - SNEH
jiných nákaz šířících se pohlavním stykem. Čekáme (a zdá se, že ještě dlouho si
počkáme) na účinný a široce dostupný způsob imunizace proti HIV. Nečekejme
však se založenými (spíše předpisy a zákon...