2012-09-05 13 views
20

W C/C++ używamy statycznych zmiennych lokalnych do utrzymywania stanu metody. Ale dlaczego nie jest obsługiwany w Javie?Dlaczego w języku Java nie ma lokalnej zmiennej statycznej?

Tak, do tego celu mogę użyć pola statycznego. Ale czy nie jest trochę dziwne stworzenie pola do zachowania stanu tylko jednej metody?

+3

"Dziwne" jest bardzo subiektywne. – Richard

+0

jaki jest twój przypadek użycia? Ogólnie rzecz biorąc, dane statyczne mają być częścią stanu obiektu. – TJD

+0

@Richard - tak, to nie jest dziwne ... po prostu inne. –

Odpowiedz

32

Znalazłeś jedyne rozwiązanie.

Java upuściła wiele komplikacji od C++, a to był jeden z nich.

Zmienne statyczne mające zasięg do funkcji, robią nieprzyjemne rzeczy we współbieżności (np. Strtok jest słynnym paskudnym narzędziem do użycia z pthreads, właśnie z tego powodu).

Ogólnie rzecz biorąc, wymagany jest obiekt ze stanem. Ta funkcja powinna wówczas mieć zmienną na poziomie obiektu. Następnie możesz utworzyć wystąpienia, z których każde będzie utrzymywało stan.

Znacznie łatwiej zrozumieć/zachować/itp.

Jeśli naprawdę potrzebujesz zachować stan jako singleton, to są to pola statyczne.

0

Być może dlatego, że metody nie są obiektami w Javie; więc utrzymanie ich stanu, jak powiedziałeś, nie ma większego sensu i myślę, że musielibyście stworzyć nową koncepcję w kodzie bajtu; używaj przedmiotu, jak powiedział Tony K.

5

Specyfikacja języka Java nie wydaje się bronić pominięcia zmiennych, które odpowiadają zmiennym C static.

Ukrywanie stanu w metodach klasowych ma kilka wad, gdy widzimy je z perspektywy Java. Ogólnie rzecz biorąc, istnienie zmiennej statycznej na poziomie funkcji nie jest rodzajem szczegółów implementacji, które chcesz ujawnić poza tą funkcją.

Ale stan metody jest w rzeczywistości częścią stanu klasy, a statyczne zmienne na poziomie metody musiałyby zostać przekształcone do postaci szeregowej/deserializowanej za każdym razem, gdy obiekt byłby utrwalony. To może nie brzmieć zwyczajnie, pochodząc z tła C., więc zanotuję kilka typowych przykładów.

  • Klastry serwerów aplikacji mogą przekazywać obiekty sesji użytkownika między węzłami, aby zapewnić odporność na uszkodzenia.
  • JAXB mogłyby zostać wykorzystane do Marshall obiektu do dokumentu XML
  • JPA może być używany do utrwalania stanu obiektu do bazy

Jeśli wartość zmiennej jest warto zaoszczędzić, gdy obiekt jest utrwalane, istnieje duża szansa, że ​​kod spoza tej klasy będzie musiał odwoływać się do tej wartości. I nagle oznacza to określenie poziomów dostępu - czy zmienna statyczna w metodzie publicznej jest automatycznie publiczna? Czy programista musiałby to zadeklarować?

Musimy również myśleć o rozszerzalności. Czy klasy pochodne byłyby wymagane do zaimplementowania tej samej zmiennej statycznej? A może byłoby odniesienie do zmiennej z funkcji w klasie bazowej?

Jest bardziej prawdopodobne, że metoda C, która użyłaby statycznej zmiennej lokalnej, byłaby dobrym kandydatem dla klasy w Javie. Ma stan i miejmy nadzieję, że istnieje w jednym celu.Występuje niewielka wada polegająca na enkapsulacji funkcjonalności do obiektu i zapewnia czystszą separację między wartościami przejściowymi (takimi jak zmienne lokalne) i bardziej długotrwałym stanem.

1

Niektóre inne odpowiedzi pokazują, dlaczego nie chcesz tego mieć. Ale możesz też zapytać dlaczego z historycznego punktu widzenia.

Aby odpowiedzieć na to pytanie, trzeba zacząć rozumieć, dlaczego C ma statyczne zmienne lokalne. C ma znacznie mniej środków niż Java i C++, aby ograniczyć zakres zmiennej, jedynymi opcjami dla danych statycznych są "wewnątrz pliku" i "wszędzie". Zapewnia to dodatkową warstwę, aby ograniczyć zakres.

Ważnym aspektem C++ jest kompatybilność z, więc jest dozwolona również w C++. Ale nie potrzebuje już lokalnego zasięgu statycznego, ponieważ istnieje wiele innych sposobów ograniczenia zakresu danych statycznych. Zastosowanie nie jest popularne w (nowoczesnym) C++.

Java czerpie wiele inspiracji z C/C++, nie musiała się martwić kompatybilnością wsteczną, więc można ją pominąć.

Powiązane problemy