Dlaczego w Javie nie ma stałej funkcji?

Próbowałem zidentyfikować przyczynę stałych w Javie Dowiedziałem się, że Java pozwala nam deklarować stałe za pomocą słowa kluczowego final.

Moje pytanie brzmi dlaczego Java nie wprowadziła stałej (const) funkcji. Ponieważ wiele osób twierdzi, że pochodzi z C++, w C++ mamy słowo kluczowe const.

Podzielcie się swoimi przemyśleniami.
Author: user207421, 2010-04-29

8 answers

Za każdym razem, gdy przechodzę od ciężkiego kodowania C++ do Javy, zajmuje mi trochę czasu, aby dostosować się do braku const-poprawności w Javie. To użycie const W C++ jest znacznie inne niż deklarowanie stałych zmiennych, jeśli nie wiesz. Zasadniczo zapewnia, że obiekt jest niezmienny, gdy jest dostępny za pomocą specjalnego rodzaju wskaźnika zwanego wskaźnikiem const gdy w Javie, w miejscach, w których normalnie chciałbym zwrócić wskaźnik const, zwracam odniesienie z interfejsem Typ zawierający tylko metody, które nie powinny mieć skutków ubocznych. Niestety, nie jest to wymuszone przez langauge.

Wikipedia oferuje następujące informacje na ten temat:

Co ciekawe, specyfikacja języka Java traktuje const jako zarezerwowane słowo kluczowe - tzn. takie, które nie może być użyte jako identyfikator zmiennej - ale nie przypisuje mu żadnej semantyki. Uważa się, że zastrzeżenie słowa kluczowego miało na celu umożliwienie rozszerzenia języka Java o Metody const w stylu C++i wskaźnik do typu const. Zgłoszenie enhancement request ticket w Java Community proces implementacji poprawności const w Javie zostało zamknięte w 2005 roku, co sugeruje, że poprawność const prawdopodobnie nigdy nie znajdzie się w oficjalnej specyfikacji Javy.

 130
Author: Gunslinger47,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-29 08:49:57

Co oznacza const
Po pierwsze, zdaj sobie sprawę, że semantyka słowa kluczowego" const " oznacza różne rzeczy dla różnych ludzi: {]}

  • odniesienie tylko do odczytu - Java final semantyka - sama zmienna odniesienia nie może być przypisana do innej instancji (lokalizacja pamięci), ale sama instancja może być modyfikowana
  • readable-only reference - C const pointer/reference semantyka-oznacza, że odniesienie to nie może być użyte do modyfikacji instancja (np. nie można przypisać do zmiennych instancji, nie można wywołać mutowalnych metod) - wpływa tylko na zmienną referencyjną, więc odwołanie non-const wskazujące na tę samą instancję może zmodyfikować instancję
  • immutable object - oznacza, że sama instancja nie może zostać zmodyfikowana - odnosi się do instancji, więc wszelkie odniesienia non-const nie będą dozwolone lub nie mogą być użyte do modyfikacji instancji
  • pewna kombinacja powyżej ?
  • inni ?

Dlaczego lub dlaczego nie const
Po drugie, jeśli naprawdę chcesz zagłębić się w niektóre argumenty "pro" vs "con", zapoznaj się z dyskusją pod tą prośbą o ulepszenie (RFE) "błąd". Ten RFE żąda funkcji "const" typu "Tylko do odczytu". Otwarty w 1999, a następnie zamknięty/odrzucony przez Sun w 2005, temat "const" był energicznie dyskusja:

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 jasnych) powodów przeciwko const obejmują:

    Może mieć mylącą semantykę, która może być nadużywana i/lub nadużywana (zobacz co oznacza const powyżej)
  • może powielać możliwości dostępne w inny sposób (np. projektując klasę niezmienną, używając immutable interface)
  • Może to być funkcja pełzania, co prowadzi do potrzeby innych zmian semantycznych, takich jak obsługa przekazywania obiektów przez wartość.]}

Zanim ktoś spróbuje mnie przedyskutować, czy są to dobre czy złe powody, zauważ, że są to nie moje powody . Są to po prostu "sedno" niektórych powodów, które zebrałem z skimming dyskusji RFE. Sam niekoniecznie się z nimi zgadzam - po prostu staram się przytoczyć, dlaczego niektórzy (nie ja) mogą czuć się const słowo kluczowe może nie być dobrym pomysłem. Osobiście chciałbym, aby semantyka "const" była wprowadzana do języka w sposób jednoznaczny.

 78
Author: Bert F,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-19 11:40:30

const W C++ nie oznacza to, że wartość jest stałą.

const W C++ oznacza, że klient umowy zobowiązuje się nie zmieniać jej wartości.

Zmiana wartości wyrażenia const staje się bardziej widoczna, jeśli znajdujesz się w środowisku obsługującym współbieżność opartą na wątkach.

Ponieważ Java została zaprojektowana od początku do obsługi wątków i blokowania współbieżności, nie dodało to zamieszania, przeciążając termin, aby mieć semantykę, którą ma final.

Eg:

#include <iostream>

int main ()
{
    volatile const int x = 42;

    std::cout << x << std::endl;

    *const_cast<int*>(&x) = 7;

    std::cout << x << std::endl;

    return 0;
}

Wyjście 42 potem 7.

Chociaż x oznaczone jako const, ponieważ tworzony jest non-const alias, x nie jest stałą. Nie każdy kompilator wymaga volatile do 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 przyzwyczajenie się do myślenia, że const oznacza, że coś się nie zmieni, staje się coraz bardziej niebezpieczne. const oznacza to, że Twój kod nie może go zmienić bez cast, a nie, że wartość jest stała.

 7
Author: Pete Kirkham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-29 14:27:23

To trochę stare pytanie, ale pomyślałem, że i tak dołożę swoje 2 centy, ponieważ ten wątek pojawił się dzisiaj w rozmowie.

To nie do końca odpowiada Dlaczego nie ma const? ale Jak sprawić, by Twoje klasy stały się niezmienne. (Niestety nie mam jeszcze wystarczającej reputacji, aby dodać komentarz do zaakceptowanej odpowiedzi)

Sposobem na zagwarantowanie niezmienności obiektu jest uważniejsze zaprojektowanie klas, aby były niezmienne. Wymaga to nieco więcej troska niż zmienna Klasa.

This goes back to Josh Bloch ' S Effective Java pozycja 15-zminimalizuj zmienność . Jeśli nie przeczytałeś książki, odbierz kopię i przeczytaj ją kilka razy gwarantuję, że będzie to twoja graficzna "Gra java" .

W punkcie 15 Bloch sugeruje, że należy ograniczyć zmienność klas, aby zapewnić stan obiektu.

Cytując bezpośrednio książkę:

Klasa niezmienna jest po prostu klasą, której instancje nie można go modyfikować. Wszystkie informacje zawarte w każdym wystąpieniu są dostarczane podczas ich tworzenia i są ustalane na czas życia obiektu. Biblioteki platformy Java zawierają wiele niezmiennych klas, w tym String, Boxed primitive Class oraz BigInte-ger i BigDecimal. Istnieje wiele dobrych powodów: niezmienne klasy są łatwiejsze w projektowaniu, implementacji i użyciu niż zmienne klasy. Są mniej podatne na błędy i są bardziej bezpieczne.

Bloch następnie opisuje jak aby twoje zajęcia stały się niezmienne, postępuj zgodnie z 5 prostymi zasadami:

  1. nie podawaj żadnych metod modyfikujących stan obiektu (np. setterów, aka mutatorów)
  2. upewnij się, że klasa nie może być rozszerzona (oznacza to zadeklarowanie samej klasy jako final).
  3. Utwórz wszystkie pola final.
  4. Utwórz wszystkie pola private.
  5. zapewnić wyłączny dostęp do dowolnych zmiennych komponentów. (wykonując defensywne kopie obiektów)

Po Więcej SZCZEGÓŁÓW I Gorąco polecam odbiór kopii książki.

 4
Author: grego,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-07 19:36:02

Semantyka C++ const bardzo różni się od Javy final. Gdyby projektanci użyli const byłoby to niepotrzebnie mylące.

Fakt, że const jest słowem zastrzeżonym sugeruje, że projektanci mieli pomysły na wdrożenie const, ale od tego czasu zdecydowali się go odrzucić; zobacz Ten zamknięty błąd. Podane powody obejmują, że dodanie wsparcia dla stylu C++ const spowodowałoby problemy ze zgodnością.

 3
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-29 16:02:11

Istnieje sposób tworzenia zmiennych "const" w Javie, ale tylko dla określonych klas. Po prostu zdefiniuj klasę z końcowymi właściwościami i podklasuj ją. Następnie użyj klasy bazowej, w której chcesz użyć "const". Podobnie, jeśli chcesz użyć metod "const", dodaj je do klasy bazowej. Kompilator nie pozwoli Ci zmodyfikować tego, co uważa za ostateczne metody klasy bazowej, ale będzie odczytywał i wywoływał metody na podklasie.

 -1
Author: user1122069,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-07 02:14:52

Istnieją dwa sposoby definiowania stałych - const i static final, z dokładnie tą samą semantyką. Ponadto static final opisuje zachowanie lepiej niż const

 -2
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-29 08:45:17

Słyszałem plotkę, że używanie Enum w Javie jest złe dla wydajności gier. Nie wiem dlaczego. Const byłby lepszy...

Przykłady rzeczywistego użycia CONST w Javie... Zakoduj to tak... a wtedy twoje instrukcje switch będą działać bez narzekania..

protected static final int cOTHER = 0;
protected static final int cRPM = 1;
protected static final int cSPEED = 2;
protected static final int cTPS = 3;
protected int DataItemEnum = 0;

public static final int INVALID_PIN = -1;
public static final int LED_PIN = 0;

.

switch (this.DataItemEnum) {
    case cRPM:
        percent = (Value - 0.001*Min)/(Max - Min);
        break;
    default:
        percent  = (Value - Min)/(Max - Min);
        break
}
 -2
Author: hamish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-17 23:37:25