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...