Jedną z proponowanych funkcji „Project Coin” Java 7 był „operator Elvisa”. Raport z prezentacją 2009 JavaOne nad projektem Coin opisał to w następujący sposób:
Jedną z „małych funkcji” omawianych w tej prezentacji jest tak zwany „operator Elvisa”, bardziej zwięzła wersja operatora trójskładnikowego. Czuję, że brakuje mi niektórych funkcji Groovy podczas korzystania z tradycyjnej Java i byłby to jeden operator, którego mógłbym używać w obu językach, gdyby został dodany. Operator „Elvis” jest przydatny do określania wartości domyślnej, której można użyć, gdy obliczone wyrażenie ma wartość NULL. Podobnie jak bezpieczny operator nawigacji Groovy, jest to zwięzły sposób na określenie, jak uniknąć niepotrzebnych zer. Wcześniej blogowałem o tym, jak lubię unikać wyjątku NullPointerException.
Podczas gdy inne aspekty Monety Projektu zostały ostatecznie zaimplementowane, ten nie został. Dlaczego operator Elvis został ostatecznie odrzucony, mimo że został przedstawiony na JavaOne jako prawdopodobny kandydat do włączenia?
Żeby było jasne, pytam konkretnie o tego operatora i powód, dla którego został odrzucony w ramach „Project Coin” Java 7, biorąc pod uwagę, że był wtedy poważnie rozważany. Podejrzewam, że istnieją listy mailingowe lub takie, w których omawiano przyczyny odrzucenia, ale nic nie mogłem znaleźć. Jeśli istnieją bardziej ogólne informacje o tym, dlaczego nie jest on zawarty w żadnej wersji Java, jest to dopuszczalne, ale nie preferowane.
źródło
?.
jako przykład ) z pewnością byłoby zbyt szeroka jak zwykły pytanie, ale czy masz dobrą odpowiedź.Odpowiedzi:
Oczywiście najlepszą osobą, która może zadać to pytanie, jest ktoś z Komitetu Wykonawczego JCP, a nie my. Nie powstrzyma mnie to jednak od spekulacji.
Odpowiedź na każde pytanie „dlaczego ta funkcja nie została zaimplementowana” zawsze brzmi, ponieważ korzyści nie przekraczały kosztów.
Eric Lippert (były członek zespołu C #) mówi, że aby produkt miał jakąś funkcję, ta funkcja musi być:
Innymi słowy, musi być wiele ważnych rzeczy, które muszą się wydarzyć, zanim będzie można zrealizować jakąkolwiek nową funkcję języka programowania. Koszty są większe, niż myślisz.
W zespole C # każde nowe żądanie funkcji zaczyna się od wyniku minus 100. Następnie zespół ocenia korzyści i koszty, dodając punkty za korzyści i odejmując punkty za koszty. Jeśli wynik nie przekroczy zero, proponowana funkcja zostanie odrzucona. Innymi słowy, nowa funkcja musi zapewniać istotne korzyści.
Ale operator Elvisa dostał się do C #. Dlaczego więc nie przeszedł na Javę?
Pomimo ich widocznych podobieństw, Java i C # mają znacząco różne filozofie językowe. Świadczy o tym fakt, że programy Java dla przedsiębiorstw są zwykle dużymi strukturalnymi kolekcjami architektury. Zwięzłość i ekspresja językowa są poświęcane na ołtarzu ceremonii i łatwości kodowania. Dobrze znane wzorce architektoniczne oprogramowania, które każdy zespół programistów może rozpoznać, są lepsze od udogodnień językowych.
Rozważ tę wymianę Reddit :
Te głębokie różnice w filozofii języka obejmują nie tylko sposób, w jaki języki są używane, ale także sposób, w jaki realizowany jest sam proces projektowania języka. C # jest życzliwym językiem dyktatora . Aby uzyskać nową funkcję w języku C #, naprawdę musisz przekonać tylko jedną osobę: Anders Hejlsberg .
Java ma bardziej konserwatywne podejście. Aby uzyskać nową funkcję w Javie, musi uzyskać konsensus od konsorcjum dużych dostawców, takich jak Oracle, IBM, HP, Fujitsu i Red Hat. Oczywiście proces ten będzie wolniejszy i będzie stanowić wyższy pasek dla nowych funkcji językowych.
Pytanie „dlaczego funkcja X nie została zaimplementowana ...” zawsze zawiera niejawnie słowa „… jeśli to oczywiście taki dobry pomysł?” Jak odpowiednio wykazałem tutaj, wybór nigdy nie jest tak prosty.
źródło