Dlaczego wszystkie pola w interfejsie są domyślnie statyczne i ostateczne?

Próbuję tylko zrozumieć, dlaczego wszystkie pola zdefiniowane w interfejsie są domyślnie static i final. Idea przechowywania pól static mA dla mnie sens, ponieważ nie można mieć obiektów interfejsu, ale dlaczego są final (w domyśle)?

Ktoś wie dlaczego projektanci Javy zaczęli tworzyć pola w interfejsie static i final?

Author: Willi Mentzel, 2009-10-03

7 answers

Interfejs nie może mieć zachowania lub stanu, ponieważ ma na celu określenie tylko umowy interakcji, bez szczegółów implementacji. Żadne zachowanie nie jest wymuszane przez nie zezwalanie na inicjowanie bloków metody / konstruktora lub statycznej / instancji. Żaden stan nie jest wymuszany przez zezwalanie tylko na statyczne pola końcowe.Dlatego klasa może mieć stan (stan statyczny), ale stan instancji nie jest wnioskowany przez interfejs.

BTW: stała w Javie jest definiowana przez statyczne pole końcowe (i przez konwencja nazwa używa UPPER_CASE_AND_UNDERSCORES).

 119
Author: Adriaan Koster,
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
2017-10-13 08:38:02

POWÓD BYCIA final

Dowolne implementacje mogą zmieniać wartość pól, jeśli nie są definiowane jako końcowe. Wtedy staną się częścią realizacji. Interfejs jest czystą specyfikacją bez żadnej implementacji.

POWÓD BYCIA static

Jeśli są statyczne, To należą do interfejsu, a nie do obiektu, ani do typu run-time obiektu.

 23
Author: Gurpreet singh sidhuu,
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
2017-07-12 15:59:55

Jest tu kilka punktów:

To, że pola w interfejsie są domyślnie statyczne, nie oznacza, że muszą być stałymi w czasie kompilacji, a nawet niezmiennymi. Można zdefiniować np.

interface I {
  String TOKEN = SomeOtherClass.heavyComputation();
  JButton BAD_IDEA = new JButton("hello");
}

(uważaj, że robienie tego wewnątrz definicji adnotacji może mylić javac , odnosząc się do faktu, że powyższe kompiluje się do statycznego inicjalizatora.)

Również powód tego ograniczenia jest bardziej stylistyczny niż techniczny, i wiele osób chciałoby zobaczyć, jak jest zrelaksowany.

 16
Author: Jesse Glick,
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
2009-10-29 00:57:29

Pola muszą być statyczne, ponieważ nie mogą być abstrakcyjne (jak metody mogą). Ponieważ nie mogą być abstrakcyjne, implementatorzy nie będą w stanie logicznie dostarczyć różnych implementacji pól.

Pola muszą być ostateczne, myślę, ponieważ pola mogą być dostępne przez wiele różnych implementatorów, co pozwala na ich zmianę może być problematyczne (jako synchronizacja). Również w celu uniknięcia jego ponownego wdrożenia (ukrytego).

Tylko moja myśl.

 9
Author: NawaMan,
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
2009-10-03 11:36:11

Uważam wymóg, aby pola były ostateczne za zbyt restrykcyjne i błąd projektantów języka Java. Są czasy, np. obsługa drzewa, kiedy trzeba ustawić stałe w implementacji, które są wymagane do wykonywania operacji na obiekcie typu interface. Wybranie ścieżki kodu w klasie implementującej jest kludge. Obejście, którego używam, polega na zdefiniowaniu funkcji interfejsu i zaimplementowaniu jej poprzez zwrócenie dosłownego:

public interface iMine {
    String __ImplementationConstant();
    ...
}

public class AClass implements iMine {
    public String __ImplementationConstant(){
        return "AClass value for the Implementation Constant";
    }
    ...
}

public class BClass implements iMine {
    public String __ImplementationConstant(){
        return "BClass value for the Implementation Constant";
    }
    ...
}

Jednak byłoby prostsze, jaśniejsze i mniej podatne na błędne implementacje użycie tej składni:

public interface iMine {
    String __ImplementationConstant;
    ...
}

public class AClass implements iMine {
    public static String __ImplementationConstant =
        "AClass value for the Implementation Constant";
    ...
}

public class BClass implements iMine {
    public static String __ImplementationConstant =
        "BClass value for the Implementation Constant";
    ...
}
 2
Author: Carl Klapper,
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-04-03 19:13:11

Specyfikacja, umowy... Instrukcja maszynowa dostępu do pola wykorzystuje adres obiektu plus przesunięcie pola. Ponieważ klasy mogą zaimplementować wiele interfejsów, nie ma sposobu, aby niekończące się pole interfejsu miało takie samo przesunięcie we wszystkich klasach rozszerzających ten interfejs. Dlatego należy zaimplementować inny mechanizm dostępu do pola: dwa dostępy do pamięci (get field offset, get field value) zamiast jednego Plus utrzymanie rodzaju wirtualnej tabeli pól (analog wirtualnej tabeli metod). Domyślam się, że po prostu nie chcieli komplikować jvm dla funkcjonalności, które można łatwo symulować za pomocą istniejących rzeczy (metod).

W Scali możemy mieć pola w interfejsach, choć wewnętrznie są one zaimplementowane tak jak wyjaśniłem powyżej (jako metody).

 0
Author: Yaroslav,
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-10-04 07:37:45

static:

Cokolwiek (zmienna lub Metoda), które jest static w Javie, może być wywołane jako Classname.variablename lub Classname.methodname lub bezpośrednio. Nie jest obowiązkowe wywoływanie go tylko przez użycie nazwy obiektu.

W interfejsie obiekty nie mogą być deklarowane, a static umożliwia wywoływanie zmiennych tylko poprzez nazwę klasy bez potrzeby używania nazwy obiektu.

final:

Pomaga utrzymać stałą wartość zmiennej, ponieważ nie może być nadpisana w jej podklasach.

 -1
Author: Sabika,
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-11-05 18:33:18