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

studijní text Traceback (most recent call last) in () ----> 1 a + b TypeError: unsupported operand type(s) for +: 'int' and 'str'

Více

Spring framework 2.0

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

Více

AIDS - SNEH

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

Více

JSF

JSF CZJUG: JavaServer Faces

Více

Práce s kolekcemi – algoritmy a implementace ve zvoleném

Práce s kolekcemi – algoritmy a implementace ve zvoleném prohledávání  díky  své  velké  časové  náročnosti  není  vhodné.  Jednotlivé   řetězce  se  rozdělilí  do  skupin,  které  si  jsou  podobné.  K  tomu  jsou  hešovací   funkce,  která  dokážou  je...

Více

skripta-datoveStrukt..

skripta-datoveStrukt.. ♦ mapy (maps) – na rozdíl od seznamů se pracuje s dvojicí prvků. První prvek se nazývá klíč a musí být jedinečný, druhý prvek se nazývá hodnota. Výhodou mapy je, že vyhledávání dle klíče je rychlé....

Více

Mobilní hra Block Runner Anotace Zadání projektu Návod na

Mobilní hra Block Runner Anotace Zadání projektu Návod na BlueEnemy.  Červení  nepřátelé  reagují  jen  na  kolizi  s  hráčem.   Pokud  k  ní  dojde,  ukončí  se hra a  vyskočí  GameOver  dialog.  Žlutí  nepřátelé  při  kolizi  s  hráčem  přidají  hráči  ...

Více