Java puzzlers

Tušíte správně, dneska vás čeká pidirecenze známé knihy Java Puzzlers od Joshuy Blocha a Neala Gaftera. Kniha obsahuje 95 krátkých hříček, rébusů a hádanek, které pěkně prozkouší vaši pozornost a znalosti temných zákoutí Javy.

Kniha je to zajímavá, člověk si toho hodně připomene, popřípadě naučí. Když má dost trpělivosti a nepřeskakuje rovnou na řešení, tak si může pěkně polámat hlavu. Schválně, kdo z vás by uhodl jak nadeklarovat i, tak aby byl následující cyklus nekonečný.

while (i==i+1){}

Řešení nebudu prozrazovat, nechám vám to za domácí úkol.

Nejen že jsem se u knihy pobavil, dokonce jsem se i naučil jeden docela užitečný trik. Je to řešení rébusu číslo 53.

Mějme třídu

public class Thing
{
	public Thing(int t){...}
	...
}

Implementujeme jejího potomka, v kterém potřebujeme spočítat nějakou hodnotu, tu si uložit a zároveň ji předat do konstruktoru předka. Tzn. potřebujeme udělat něco takového:

public class MyThing extends Thing
{
	private final int arg;
	public MyThing(){
		super(arg = SomeOtherClass.func());
	}
	...
}

Samozřejmě, návratová hodnota dané funkce se často mění a my potřebujeme aby naše řešení sneslo zátěž z více vláken. Zapoměl jsem se zmínit, že předchozí kód nejde zkompilovat, kompilátor vám vynadá, že nemůžete referencovat arg před tím, než zavoláte konstruktor předka.

Já vím, že vám je to naprosto jasné. Vzpomínám si ale, že jsem jednou narazil na podobný problém a nakonec jsem ho nevyřešil. Musel jsem to nějak obejít. A přitom je řešení tak snadné a elegantní. Tak co přijdete na něj sami?

public class MyThing extends Thing
{
	private final int arg;
	public MyThing(){
		this(SomeOtherClass.func());
	}
	private  MyThing(int i)
	{
		super(i);
		arg = i;
	}
	...
}

Docela užitečná finta.

Takže abych to shrnul, knížka je to zábavná i poučná. Naučíte se spoustu věcí o různých podivnostech v Javě. Na můj vkus je v knize trochu moc hádanek týkajících se různých celočíselných přetečení, zaokrouhlovacích chyb a podobně. To jsou podle mého názoru věci, s kterými se setkáte opravdu výjimečně. Ale i tak si myslím, že si kniha zaslouží sedm hvězdiček z deseti. Tomu kdo si chce počkat až to zfilmujou, doporučuji následující trailer.

4 Responses to “Java puzzlers”

  1. benzin Says:

    add trik) A pokud je to slozitejsi na neda se to jen tak volat ze staticke metody jine tridy, tak pouzijeme privatni konstruktor a faktory metodu 😀

  2. bady Says:

    Ad. cyklus - jedno reseni ryze matematicke:

    double i = Double.POSITIVE_INFINITY;

    Ale nevim jestli Inf = Inf + 1 jde kvalifikovat jako temne zakouti Javy 😉

  3. Ladislav Thon Says:

    Mně se víc líbilo deklarovat i a j tak, aby nekonečný byl tenhle cyklus:

    while (i <= j && j <= i && i != j) ;

    🙂

  4. wombatix Says:

    > Mně se víc líbilo deklarovat i a j tak, aby nekonečný byl tenhle cyklus:

    > while (i <= j && j <= i && i != j) ;

    No a nebo while(true)

    😀