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ć:
- pomyślałem w pierwszej kolejności
- pożądany
- zaprojektowany
- określony
- zaimplementowano
- przetestowany
- udokumentowane
- wysłane do klientów
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 :
Operator Elvisa jest proponowany dla każdej wersji Java od 7 i za każdym razem był odrzucany. Różne języki mieszczą się w różnych punktach spektrum, od „czystego” do „pragmatycznego”, a języki implementujące operatora Elvisa mają tendencję do dalszego zbliżania się do pragmatycznego końca spektrum niż Java.
Jeśli masz zespół ponad 15-letnich profesjonalistów Java, którzy piszą wysoce rozproszony, wysoce współbieżny system przetwarzania zaplecza, prawdopodobnie potrzebujesz dużego stopnia rygorystyczności architektury.
Jeśli jednak masz zespół młodszego i średniego szczebla, z którego połowa przeprowadziła migrację z Visual Basic, i masz ich piszących aplikację sieci Web ASP.NET, która głównie wykonuje operacje CRUD ... wtedy zaprojektowanie grupy może być przesadą z AbstractFactoryFactory
klas abstrakcyjnych away fakt, że nie masz kontroli nad którymi pustych kolumn w bazie gówniany dziedzictwo, które należy wykorzystać.
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.