Jednou ze šikovných byť trochu nefér pastí programátorských testů je dotaz, co vypíše do konzole následující kód:
String text = "Ahoj, Honzo!"; text.replaceAll("Ahoj", "Styď se"); System.out.println(text);
Podraz je v tom, že metoda replaceAll nemodifikuje objekt, na němž je zavolána, ale namísto toho vrací nový řetězec. V případě třídy java.lang.String se tak chovají všechny metody, protože tato třída je immutable. Takže spousta respondentů odpoví, že na konzoli se vypíše řetězec „Styď se, Honzo!“ Což je sice odvážné, ale je to špatně.
Přibližně před rokem a půl jsem itenzivně řešil problém s komponentou, která měla nějakým způsobem filtrovat url požadavku, a nechtěla se to naučit. Chyba nakonec byla právě v zahození návatové hodnoty metody třídy String.
Ten problém by šel zobecnit. Máme metodu, jejíž volání je irelevantní, jestliže nepřiřadíme její výsledek. Metoda nic nemodifikuje a nemá ani žádné vedlejší účinky. Napadlo mne, že by se nebezpečí dalo odvrátit, kdyby byla k dispozici anotace, která by překladač informovala o tom, že návratová hodnota nesmí být ignorována. Překladač by pak druhý řádek mého příkladu považoval za chybu a odmítl třídu přeložit.
@MustAssign public <T> T createCopy(T original) { ...
Možná by někoho napadlo automaticky tuto anotaci používat například u getterů, ale nemyslím si, že zrovna to by byl šťastný nápad. Vezměme si například toto:
Person person = entityManager.find(Person.class, id); person.getChildren(); return person;
Volání metody getChildren() může vypadat jako chyba a metoda sama se může stát kandidátem pro naši novou skvělou anotaci. Ale spíš to vypadá jako zajištění inicializace fetch-type lazy atributu před odpojením entity.
Neuvážené plýtvání anotací by mohlo přinést i komplikace, ale jsem toho názoru, že bychom našli spoustu příkladů, kde by přínosy převážily. Jak jsem naznačil, mohlo by tomu tak být v případě metod immutable třít nebo v případě utility metod, které nemodifikují parametry.
Takže jestli znáte u oráklů někoho, kdo tam dělá víc než kafe, zkuste mu, prosím, navrhout, ať to prosadí do devítky Javy.