2010-09-08 7 views

Odpowiedz

72

Pomyśl o Enums jako klasie o skończonej liczbie instancji. Nie może być żadnych innych instancji poza tymi, które pierwotnie deklarujesz.

W związku z tym nie można mieć publicznego lub chronionego konstruktora, ponieważ umożliwiłoby to utworzenie większej liczby instancji.

Uwaga: prawdopodobnie nie jest to oficjalna przyczyna. Ale wydaje mi się, że w tym przypadku najlepiej jest myśleć o enums.

+10

To ma wiele sensu. Ale dlaczego miałby być dozwolony "domyślny"? Ponieważ wtedy inne klasy w tym samym pakiecie również mogą wywoływać konstruktora. –

+0

@Anita, czy jesteś pewien, że domyślne ustawienie jest dozwolone? – jjnguy

+1

Tak.Skompilowałem i przetestowałem próbkę kodu w OP. Bez błędów. Ale dziwne jest to, że nadal nie mogę ręcznie wywołać konstruktora, nawet z domyślnymi ustawieniami. Myślałem, że domyślne oznacza tak długo, jak jesteś w tym samym pakiecie, masz do niego dostęp? Czy tu brakuje czegoś dużego? –

16

Ponieważ nie można samodzielnie wywołać konstruktora.

Oto co ma do powiedzenia tutorials on Enums:

Uwaga: Konstruktor typu enum musi być pakiet-prywatnego lub prywatny dostęp. Automatycznie tworzy stałe zdefiniowane na początku ciała wyliczeniowego. Nie możesz sam wywołać konstruktora wyliczeniowego.

+0

Z linku podanego przez Daniela "Uwaga: Konstruktor typu wyliczeniowego musi być pakietem prywatnym lub prywatnym, automatycznie tworzy stałe zdefiniowane na początku ciała wyliczeniowego. Nie można wywołać konstruktora wyliczeniowego . " Ponieważ nie możesz tego nazwać samodzielnie, nie ma znaczenia, dlaczego może być pakietem prywatnym. – Syntax

+8

Ale z drugiej strony to ograniczenie tak naprawdę nie tłumaczy * dlaczego * nie możemy mieć publicznych lub chronionych konstruktorów wyliczeniowych. To trochę dziwne i niespójne, aby pozwolić dwóm modyfikatorom dostępu na cztery; bardziej sensownym byłoby zezwolić na wszystkie modyfikatory dostępu (ponieważ nadal nie można wywołać konstruktora) lub po prostu zezwolić na jedno (najlepsi kandydaci to "prywatny"), aby wskazać, że nie można uzyskać do nich dostępu z innych źródeł - a może domyślnie , aby zredukować szum kodowania). – gustafc

+1

@gustafc: moje uczucia dokładnie! –

6

Wyliczenia zawierają ustalony zestaw wartości, które muszą być znane podczas kompilacji. Nie ma sensu tworzyć nowych literałów w czasie wykonywania, co byłoby możliwe, gdyby konstruktor był widoczny.

-3

Jeśli chcesz zadeklarować publiczną wersję enum, zapisz plik enum o nazwie enum.

Załóżmy uczynić enum Book{} następnie zapisać go przez Book.java i zrobić plik oddzielna dla klasy

jest to jedyny sposób, aby zadeklarować enum publicznej.

+3

Pytanie dotyczyło konstruktora, a nie Enum się. – madth3

0

Kluczowym punktem do zapamiętania jest to, że teksty stałe, które nie są ujęte w klasie może być uznana tylko modyfikatora publicznego lub domyślny, podobnie jak zakaz wewnętrznej klasy.

+0

Znowu, to pytanie dotyczy enum * konstruktorów *, a nie samych typów enum. –

Powiązane problemy