Patrząc na implementację hashmap java, nie jest w stanie zrozumieć przyczyny niektórych linii. W poniższym kodzie skopiowanym z here, w linii 365-367, nie jestem w stanie zrozumieć, dlaczego dokonali przypisania e.key do k, a następnie porównali == klawiszem [(k = e.key) == ]. Dlaczego nie zrobić bezpośrednio (klucz e.key ==). Ten wzór pojawia się kilka razy w kodzie.w kluczu implementacji java ishmap jest najpierw przypisany do obiektu, a następnie porównywany
359
360 final Entry<K,V> getEntry(Object key) {
361 int hash = (key == null) ? 0 : hash(key.hashCode());
362 for (Entry<K,V> e = table[indexFor(hash, table.length)];
363 e != null;
364 e = e.next) {
365 Object k;
366 if (e.hash == hash &&
367 ((k = e.key) == key || (key != null && key.equals(k))))
368 return e;
369 }
370 return null;
371 }
Używają one wartości k w drugiej części warunku, ale mogli napisać '(e.key == key || (key! = Null && key.equals (e.key))) 'zamiast tego i wyeliminował zmienną' k'. Nie widzę korzyści z wprowadzenia tej zmiennej lokalnej. – Eran
Dokładnie, ale w wielu podobnych sytuacjach w całym kodzie religijnie podążali za tworzeniem nowej zmiennej lokalnej. – Nitiraj
Zobacz http://stackoverflow.com/questions/10180656/why-is-lock-captured-to-a-local-variable, http://stackoverflow.com/questions/2785964/in-arrayblockingqueue-why-copy- zmienna final-member-field-into-local-final, http://stackoverflow.com/questions/28975415/why-jdk-code-style-uses-a-variable-assignment-and-read-on-the- same-line-eg-i ... – Marco13