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?