# Zkouška 14. 1. 2019

<{ForumPost(poster="18721188", timestamp=2019-01-14 12:10:06)}>
Zkouška, v porovnání s tím, co se tu píše, obsahovala podstatně víc otázek s odpovědí ve formě kousku kódu: jen polovina otázek byla testových, zbylé byly "snippetové".  
  
Bodování je +- stejné, snippetové otázky mohou nasbírat až tři body -- ale Hnětynka je uděluje hodně mírně. V té mé mi třeba prošel minimálně jeden docela velký c#ismus, které by kompilátor Javy kvůli syntaxi nevzal. Hodně IMHO záleží, jestli pochopíte, o co otázce jde (rozlišení overload/override, řetězce se nedají smysluplně porovnávat pomocí ==, jak fungují funkcionální rozhraní, jak se funkcionální rozhraní používají ve Stream API ...).  
  
Pamatuju si tam jednu docela zajímavou otázku "naimplementujte equals pro následující třídu", která měla vést na to, že Javovský kontrakt pro equals bere Object a že si pomocí instanceof musíte ověřit, s čím porovnáváte. So far so good. Tvar té třídy byl asi class Something { int SomethingId; String SomethingName; } a vůbec nebylo jasné, jestli se od vás chce strukturální nebo "entitová" rovnost. Tu první asi zvolí fanoušci funkcionálního programování zvyklí učit ručně všechny své třídy sémantice součinových typů, tu druhou lidi, co při pohledu na SomethingId vzpomenou DDD, třídu označí za jasnou entitu (ne value type) a budou porovnávat jen podle ID, ne už podlé jména. Hnětynka zdá se očekával strukturální rovnost, jelikož po vyhodnocení mluvil o porovnávání řetězců. Jelikož jsem použil strukturální rovnost, nevím, jestli entitový způsob nějak penalizoval.  
  
Zkouška je o trošku delší, než asi bývávala, jelikož opravování trvá přes půl hodiny. Pořád se v pohodě celá vejde do dvou hodin.
<{/ForumPost}>

<{ForumPost(poster="matfyzák", timestamp=2019-01-14 13:46:16)}>
Jinak já si dovolím tedy doplnit otázky, tak jak si je pamatuji:  
  
1) StringBuilder sb1 = new StringBuilder("Hello");  
StringBuilder sb2 = sb1;  
sb1.append(" world");  
System.out.println(sb1);  
System.out.println(sb2);  
  
Co se vypíše? 2x Hello world  
  
2) definované dvě přetížené funkce  
void foo(String s){  
    System.out.println("string");  
}  
  
void foo(int i){  
    System.out.println("int");  
}  
  
Co se vypíše po zavolání foo("Hello" + 1)?  
- zde se sice převede celý parametr na  string, ale pozor na deifnici metod - člověk se nesmí unáhlit a vypsat parametr, ale skutečně řetězec "string" (to ale lidé občas u zkoušky přehlédli)  
  
  
3)  
class A {  
    public A(){super(); System.out.println("A");}  
}  
  
class B {  
    public B(){super(); System.out.println("B");}  
}  
  
class C {  
    public C(){super(); System.out.println("C");}  
}  
  
Co se vypíše při vytvoření instance C? (někoho může zmást volání super v A, to je ale v pořádku) Vypíše se ABC  
  
4) synchornized blok ve statické funkci - rozhodnout co  se stane - synchronized ve statických funkcích nefunguje  
  
5) Naimplementujte MyException, kterou není odchytávat.  
- MyException dědí  Error nebo RuntimeException, ideálně  popsat i konstruktory, ale bral to i bez nich  
  
6) Otázka zmíně výše  
class Student {  
    private int studentID;  
    private String fullName;  
  
// naimplementovat equals, důležité  aby bylo metoda přepsána, nikoli přetížena  
}  
  
7) vtvořte fukcionální interface pro  (x, y) -> x.equals(y)  
interface Foo {  
@Funcional  
boolean  foo(Object o1, Object o2);  
}  
  
Nebo ještě lépe  
interface Foo<T> {  
@Funcional  
boolean foo(T t1, T t2);  
}  
  
8) ukázka jak vypadá funkiconální  interface používající se ve filtru pro streamy, bylo za úkol napsat použití tak, aby vypsal pouze řetezce delší než 5  
tj. něco jako  
stream.filter((param) -> { return s.length > 5; }  
  
9) Napsat metodu, která má parametr pole Stringů a string a má ověřit zda je  string v poli  
- řešení spousta, asi není nutné ho explicitně psát  
  
10) jedna otázka se bohužel vytratila a nevím jaká :)  
(jo, a pořadí asi taky nebude úplně stejné)
<{/ForumPost}>

<{ForumPost(poster="Dave", timestamp=2019-01-14 14:04:38)}>

 > matfyzák wrote:
 > synchornized blok ve statické funkci - rozhodnout co se stane - synchronized ve statických funkcích nefunguje

S tímto si dovolím nesouhlasit. Možná, že nějaký konkrétní příklad na zkoušce nebyl správně, ale obecně to není pravda - každý si může vyzkoušet.
<{/ForumPost}>

<{ForumPost(poster="Vaci", timestamp=2019-01-14 14:05:30)}>
Chybí otázka: Naimplementujte třídu, která může převzít libovolný počet libovolných parametrů. Tyto parametry vypíše v opačném pořadí a vrátí počet parametrů.  
Odpověď něco jako:  
public int Foo(Object.. args){  
for(int i = args.lentgh -1; i >= 0; i--) System.out.println(args*);  
return args.length;  
}*
<{/ForumPost}>

<{ForumPost(poster="Anonymous", timestamp=2019-01-14 17:35:13)}>

 > Dave wrote:
 >  > matfyzák wrote:
 >  > synchornized blok ve statické funkci - rozhodnout co se stane - synchronized ve statických funkcích nefunguje
 > 
 > 
 > S tímto si dovolím nesouhlasit. Možná, že nějaký konkrétní příklad na zkoušce nebyl správně, ale obecně to není pravda - každý si může vyzkoušet.

Doplním tu otázku číslo 4. Byl tam část kódu něco jako toto:  
public static void foo(){  
synchronized(this){  
// code  
}}  
A problém u tohoto kódu je ten, že ve statické metodě se odkazujeme na this.
<{/ForumPost}>

