Wydaje się, że w tym momencie ortodoksja Java nie powinna zasadniczo używać pól publicznych do określania stanu obiektu. (Niekoniecznie się zgadzam, ale to nie dotyczy mojego pytania.) Biorąc to pod uwagę, czy byłoby słuszne powiedzieć, że z miejsca, w którym jesteśmy dzisiaj, jasne jest, że publiczne pola Javy były błędem / wadą projektu językowego? A może istnieje racjonalny argument, że są one użyteczną i ważną częścią języka, nawet dzisiaj?
Dzięki!
Aktualizacja: Wiem o bardziej eleganckich podejściach, takich jak C #, Python, Groovy itp. Nie szukam bezpośrednio tych przykładów. Zastanawiam się tylko, czy w bunkrze jest jeszcze ktoś, mamrocząc o tym, jak wspaniałe są naprawdę publiczne pola i jak masy są tylko owcami itp.
Aktualizacja 2: Wyraźnie statyczne końcowe pola publiczne są standardowym sposobem tworzenia stałych publicznych. Odniosłem się bardziej do używania pól publicznych dla stanu obiektu (nawet stanu niezmiennego). Myślę, że wydaje się to błędem projektowym, w którym należy używać pól publicznych dla stałych, ale nie dla stanu… reguły języka powinny być egzekwowane naturalnie, przez składnię, a nie przez wytyczne.
Odpowiedzi:
Lubię je, o ile pole jest ostateczne i jest używane tylko wewnętrznie w aplikacji, a nie ujawniane w interfejsie API dla innych aplikacji. Dzięki temu kod jest krótszy i bardziej czytelny.
Nie należy ujawniać pól publicznych w interfejsie API, ponieważ ujawniając pola publiczne, narażasz także implementację. Jeśli
getXXX()
zamiast tego udostępnisz go jako metodę, możesz zmienić implementację bez zmiany interfejsu API. Na przykład możesz zmienić i uzyskać wartość ze zdalnej usługi, ale aplikacje korzystające z interfejsu API nie muszą o tym wiedzieć.Jest to realny projekt dla
public final
pól w niezmiennych klasach.Z Effective Java :
Zobacz także Dlaczego nie powinienem używać niezmiennych POJO zamiast JavaBeans?
źródło
getXXX()
zamiast tego udostępnisz go jako metodę, możesz zmienić implementację bez zmiany interfejsu API. Na przykład możesz zmienić i uzyskać wartość ze zdalnej usługi, ale aplikacje korzystające z interfejsu API nie muszą o tym wiedzieć.Zastosowanie par metod get / set jest tragiczną wadą historycznego projektu. Nie mogę wymyślić innego języka, który implementuje właściwości jako mówiony i nieefektywny.
źródło
Myślę, że publiczne pola są odpowiednie dla klasy, która jest zasadniczo typem wartości, takim jak liczba zespolona lub punkt, w którym klasa robi niewiele więcej niż grupowanie pierwotnych typów razem, takich jak struktura typu C i może definiować kilka operatorów.
źródło
java.awt.Point
a przyjaciele są trochę koszmarem.Point
polega na tym, że nie jest jednoznaczne, czy zmienna typuPoint
ma obudowywać lokalizacje, czy też ma zawierać w sobie tożsamość bytu z lokalizacją, która może się zmienić. Pod względem koncepcyjnym uważałbym, że kod, który przechodzi,Point
jest bardzo podobny do kodu, który przechodzi wokół tablic.Point
i zmodyfikuję go, powinienem oczekiwać, że obiekt, którego dotyczy, czyści aktualizację na ekranie? Nie, problemPoint
polega na tym, że można go modyfikować. MieliśmyString
/StringBuffer
ale pomysł nie doszedł do skutku. / Przekazywanie tablic ma podobne problemy.Nadal przydatne jest definiowanie stałych publicznych. Na przykład
Jednak nadal wolą enum tam , gdzie to możliwe. Na przykład
Przydaje się także do symulacji prostych klas struktur . Nie ma powodu, aby tworzyć getter i setter dla każdego pola, gdy i tak są one publiczne.
źródło
Zanim IDE stały się powszechne, upublicznienie wszystkich pól było potężnym narzędziem do szybkiego tworzenia prototypów / proofów koncepcji.
W dzisiejszych czasach jest bardzo niewiele wymówek, aby z nich korzystać, kiedy można wygenerować parę getter / setter za pomocą kliknięcia myszy.
źródło
public final
pól jest bardziej czytelnych niż 10getXXX()
metod.const
słowo kluczowe wystarczyłoby, jeśli nie są statyczne, stanowią poważne naruszenie hermetyzacji.Jest to subiektywne, ale moim zdaniem całe pojęcie publiczne / prywatne jest przestarzałe i zacofane.
W Pythonie nie ma publicznych / prywatnych; zasadniczo wszystko jest publiczne. Nie spowodował wielu problemów.
W Javie tworzysz bezcelowe programy pobierające / ustawiające dla każdego pola, aby uniknąć grzechu oznaczania ich jako „publicznych”. (IMHO, jeśli to robisz, powinieneś po prostu oznaczyć je jako publiczne).
źródło