Próbowałem zidentyfikować powód istnienia stałych w Javie. Dowiedziałem się, że Java pozwala nam deklarować stałe za pomocą final
słowa kluczowego.
Moje pytanie brzmi: dlaczego Java nie wprowadziła funkcji Constant ( const
). Ponieważ wiele osób twierdzi, że pochodzi z C ++, w C ++ mamy const
słowo kluczowe.
Podziel się swoimi przemyśleniami.
const
słów kluczowych, ale nie ma bazowy cecha. Odpowiednio poprawiono tytuł i tagi.Odpowiedzi:
Za każdym razem, gdy przechodzę od ciężkiego kodowania C ++ do Javy, trochę czasu zajmuje mi przystosowanie się do braku stałej poprawności w Javie. To użycie
const
w C ++ różni się znacznie od deklarowania stałych zmiennych, jeśli jeszcze tego nie wiesz. Zasadniczo zapewnia to, że obiekt jest niezmienny, gdy uzyskuje się do niego dostęp za pomocą specjalnego rodzaju wskaźnika zwanego wskaźnikiem do stałej W Javie, w miejscach, w których normalnie chciałbym zwrócić wskaźnik do stałej, zamiast tego zwracam odwołanie z typem interfejsu zawierające tylko metody, które nie powinny mieć skutków ubocznych. Niestety, język nie wymusza tego.Wikipedia oferuje następujące informacje na ten temat:
źródło
final
jest jednak podobna.final
na przykład metoda działa zupełnie inaczej niżconst
metody C ++ .final
kluczowe we właściwościach lub zmiennych zapewnia tylko, że właściwość lub zmienna jest przypisana tylko raz . Nadal można by zmienić stan tego obiektu np. Wywołując jakąś metodę z efektami ubocznymi.final
jest trochę podobny do alokacji stosu w C ++ pod względem odwoływania się do obiektu, a nie wskaźnika, ale to wszystko. To oczywiście uzupełnienie tego, co już powiedział dom0.final
w Javie wydaje się działać jak C ++const
dla typów wartości, ale bardziej jak C ++ non-constT&
dla typów referencyjnychCo to
const
znaczyPo pierwsze, uświadom sobie, że semantyka słowa kluczowego „const” oznacza różne rzeczy dla różnych osób:
final
semantyka języka Java - samej zmiennej odwołania nie można ponownie przypisać, aby wskazywała na inną instancję (lokalizację w pamięci), ale samą instancję można modyfikowaćconst
wskaźnik C / semantyka odwołania - oznacza, że tego odwołania nie można użyć do modyfikacji instancji (np. nie można przypisać do zmiennych instancji, nie można wywołać metod mutowalnych) - wpływa tylko na zmienną referencyjną, więc odwołanie inne niż const wskazujące na ta sama instancja może modyfikować instancjęDlaczego lub dlaczego nie
const
Po drugie, jeśli naprawdę chcesz zagłębić się w niektóre argumenty „za” i „przeciw”, zobacz dyskusję w ramach tego „błędu” prośby o wzmocnienie (RFE). Ten RFE wymaga funkcji „const” typu „tylko do odczytu”. Otwarty w 1999 r., A następnie zamknięty / odrzucony przez Sun w 2005 r., Temat "const" był intensywnie dyskutowany:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070
Chociaż istnieje wiele dobrych argumentów po obu stronach, niektóre z często cytowanych (ale niekoniecznie przekonujących lub jednoznacznych) powodów przeciwko
const
obejmują:const
oznacza powyżej)Zanim ktokolwiek spróbuje ze mną debatować, czy są to dobre czy złe powody, zauważ, że to nie są moje powody . Są po prostu „sednem” niektórych powodów, które uzyskałem, przeglądając dyskusję na temat RFE. Niekoniecznie się z nimi zgadzam - po prostu próbuję przytoczyć, dlaczego niektórzy ludzie (nie ja) mogą
const
uważać, że słowo kluczowe może nie być dobrym pomysłem. Osobiście chciałbym, aby więcej semantyki „const” zostało wprowadzonych do języka w sposób jednoznaczny.źródło
volatile
tak łatwo jest zrozumieć? Albofinal
? Meh.const
w C ++ nie oznacza, że wartość jest stałą.const
w C ++ oznacza, że klient kontraktu zobowiązuje się nie zmieniać jego wartości.To, czy wartość
const
wyrażenia zmienia się, staje się bardziej widoczne, jeśli jesteś w środowisku, które obsługuje współbieżność opartą na wątkach.Ponieważ Java została zaprojektowana od samego początku do obsługi współbieżności wątków i blokad, nie spowodowało to zamieszania poprzez przeciążenie terminu w celu uzyskania semantyki, która
final
ma.na przykład:
wyjścia 42, a następnie 7.
Chociaż
x
oznaczono jakoconst
, ponieważ tworzony jest alias inny niż const,x
nie jest stałą. Nie każdy kompilator wymagavolatile
tego zachowania (chociaż każdy kompilator może wstawić stałą)W bardziej skomplikowanych systemach otrzymujesz aliasy const / non-const bez użycia
const_cast
, więc nawyk myślenia, że const oznacza, że coś się nie zmieni, staje się coraz bardziej niebezpieczny.const
oznacza po prostu, że twój kod nie może go zmienić bez rzutowania, a nie, że wartość jest stała.źródło
const
nie oznacza, że wartość jest stała. Oznacza to, że klient wartości jest zmuszony nie modyfikować jej. W twoim przykładzie nie ma aliasu, więc wszyscy użytkownicy podlegają tym samym ograniczeniom. W ogóle tak nie jest.const
wpływa na klientów, a nie na wartość - mówi, że nie możesz tego zmienić, nie że to się nie zmieni.immutable interface
iimmutable object
to inny sposób (możliwy do pokonania za pomocą rzutowania i odbicia) na naśladowanie stałej w Javie. „True” const można wykonać za pomocą SealedObject , niestety niszczy to przypadek użycia naszego obiektu.To trochę stare pytanie, ale pomyślałem, że i tak oddam moje 2 centy, ponieważ ten wątek pojawił się dzisiaj w rozmowie.
To nie odpowiada dokładnie, dlaczego nie ma stałej? ale jak uczynić swoje klasy niezmiennymi. (Niestety nie mam jeszcze wystarczającej reputacji, aby opublikować komentarz do zaakceptowanej odpowiedzi)
Sposobem na zagwarantowanie niezmienności obiektu jest staranne zaprojektowanie klas, aby były niezmienne. Wymaga to nieco więcej uwagi niż zmienna klasa.
To sięga wstecz do efektywnego elementu Java 15 Josha Blocha - Minimalizuj zmienność . Jeśli nie czytałeś książki, weź kopię i przeczytaj ją kilka razy. Gwarantuję, że poprawi to twoją figuratywną "grę java" .
W punkcie 15 Bloch sugeruje ograniczenie zmienności klas w celu zapewnienia stanu obiektu.
Aby bezpośrednio zacytować książkę:
Bloch następnie opisuje, jak uczynić swoje klasy niezmiennymi, stosując 5 prostych zasad:
final
).final
.private
.Aby uzyskać więcej informacji, gorąco polecam zabrać ze sobą egzemplarz książki.
źródło
Semantyka języka C ++
const
bardzo różni się od języka Javafinal
. Gdyby projektanci go użyliconst
, byłoby to niepotrzebnie zagmatwane.Fakt, że
const
jest to słowo zastrzeżone, sugeruje, że projektanci mieli pomysły na realizacjęconst
, ale od tamtej pory się na to nie zgadzają; zobacz ten zamknięty błąd . Podane przyczyny obejmują to, że dodanie obsługi stylu C ++const
spowodowałoby problemy ze zgodnością.źródło
Istnieje sposób na tworzenie zmiennych „const” w Javie, ale tylko dla określonych klas. Po prostu zdefiniuj klasę z ostatecznymi właściwościami i podklasuj ją. Następnie użyj klasy bazowej, w której chciałbyś użyć „const”. Podobnie, jeśli potrzebujesz użyć metod „const”, dodaj je do klasy bazowej. Kompilator nie pozwoli ci modyfikować tego, co uważa za ostateczne metody klasy bazowej, ale odczyta i wywoła metody w podklasie.
źródło
Istniałyby dwa sposoby definiowania stałych -
const
istatic final
przy użyciu tej samej semantyki. Ponadtostatic final
lepiej opisuje zachowanie niżconst
źródło
static
(nie należy do konkretnej instancji) ifinal
- nie można jej zmienić.Możesz użyć statycznego finału, aby stworzyć coś, co działa podobnie do Const, użyłem tego w przeszłości.
źródło