• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java - Domyślny konstruktor w enumach

0 głosów
810 wizyt
pytanie zadane 16 listopada 2018 w Java przez allenkun Początkujący (400 p.)

Pracując z enumami, natrafiłem na bardzo ciekawy przypadek. Tak jak podczas definiowania klas nie podamy żadnego konstruktora, to wiemy że klasa posiada domyślny konstruktor bez argumentów. Jednak gdy w naszej klasie utworzymy konstruktor, który przyjmuje jakiś argument to nasz domyślny konstruktor zniknie i nie będziemy więcej mogli utworzyć obiektu naszej klasy bez podania żadnych argumentów przy jego tworzeniu. Bardziej konkretnie:

public class Person{

    private int age;

    public Person(int age)
    {
        this.age = age;
    }


}

W przypadku tej klasy, gdy będziemy chcieli utworzyć instancje w taki sposób:

Person pers = new Person();

Kompilator wyrzuci nam błąd bo nie podaliśmy argumentów. O dziwo w przypadku enumów takiego błędu nie otrzymujemy. Dla konkretu również podam przykład:

public enum CommandWord {
       
        GO("go"), QUIT("quit"), HELP("help"), LOOK, BACK, TAKE, DROP, ITEMS, UNKNOWN;
        
        private String commandString;
        
        private CommandWord(String commandString)
        {
            this.commandString = commandString;
        }
    }

Taki kod nie wyrzuca nam żadnego błędu. Czyli o ile z tego co się dowiedziałem enumy również posiadają domyślny konstruktor bez argumentów, to nawet po podaniu konstruktora z argumentami dalej moge tworzyć instancje wewnątrz enuma bez podania argumentów. Zdaje sobie oczywiście sprawe, że enum jest klasą specjalną i rządzi się innymi prawami niż inne klasy, aczkolwiek może jest ktoś w stanie mi wytłumaczyć jak to funkcjonuje w Javie w przypadku enuma. Czy domyślny konstruktor bezargumentowy dalej jest aplikowany nawet gdy podamy nasz wlasny konstruktor? Czy dziala to na innej zasadzie?

1
komentarz 16 listopada 2018 przez Aisekai Nałogowiec (42,190 p.)
Jesteś pewien, że kompilator dopuszcza utworzenie konstruktora parametrowego w enumie, w chwili gdy nie masz konstruktora prywatnego/protected? W enumie musi być taki konstruktor, a dodanie jakiegokolwiek innego konstruktora powoduje "usunięcie" konstruktora domyślnego (nawet w Enumie)
komentarz 16 listopada 2018 przez Wiciorny Ekspert (282,600 p.)
jest prywatny.
komentarz 16 listopada 2018 przez Aisekai Nałogowiec (42,190 p.)
A to sory, nie zauważyłem.
komentarz 17 listopada 2018 przez Wiciorny Ekspert (282,600 p.)
w pierwszej chwili też przyjąłem " Person" jako - enum i pomyslałem, że coś nie halo i jak to działa z konstruktorem default-no private

1 odpowiedź

0 głosów
odpowiedź 16 listopada 2018 przez Wiciorny Ekspert (282,600 p.)

The default constructor is private, has no formal parameters, and has no throws clause. This makes the enum non-instantiable even if no constructor is explicitly declared. An enum in java has a default constructor when it's is not defined and it's private.

 W twoim przypadku działa deklarowany,  wiec tylko przez taki konstruktor powołasz enum. 

Podobne pytania

0 głosów
1 odpowiedź 325 wizyt
pytanie zadane 31 stycznia 2021 w Java przez p_wel Nowicjusz (120 p.)
0 głosów
1 odpowiedź 3,476 wizyt
pytanie zadane 4 marca 2016 w Java przez Aisekai Nałogowiec (42,190 p.)
0 głosów
1 odpowiedź 271 wizyt

93,695 zapytań

142,613 odpowiedzi

323,225 komentarzy

63,226 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...