2009-10-01 20 views
12

Poszedłem na tę rozmowę kwalifikacyjną na stanowisko programisty i dali mi test z sytuacjami w kodeksie narożnym, zazwyczaj z 4 opcjami do wyboru.
Jedno z pytań było zadeklarowane w enum poza zakresem klasy, szybko sprawdziłem odpowiedź "nie kompilowałem" i kontynuowałem z pozostałymi pytaniami. To było coś jak:Enum zadeklarowany poza zakresem klasy

enum Colors {BLUE,RED,GREEN} 

class Test { 
    //other code, not really important with my question 
} 

Ten kod faktycznie kompiluje.
Poza tym, że taki wywiad (może lub) może nie być przydatny, aby dowiedzieć się, czy jest to dobry programista, niepokoi mnie: dlaczego miałbym deklarować takie wyliczenie? Dlaczego mogę to zrobić tylko dzięki enum? Zrobiłem kilka testów i okazało się, że są widoczne w klasie, ale nie w innych klasach.

Sidenote: Zdobyłem naprawdę słabe wyniki: P. Mam maksimum teorii, ale w pobliżu najniższej możliwej sytuacji w sytuacjach kodowania narożnego. Nie sądzę, że dostanę tę pracę.

+3

Będzie widoczny dla innych klas w tej samej przestrzeni nazw, nie tylko w pliku. Większość wyliczeń w BCL jest zadeklarowanych poza klasą, tak jak w podanym przykładzie (z wyjątkiem tego, że są one publiczne). Pytanie brzmi, dlaczego * nie chcesz * ogłosić takiego wyliczenia? – Groo

+0

Warto sprawdzić, czy ktoś pracował z kontrolą dostępu java, a klasy nie są w 100% formą public class A {private String field; public method() {}} domyślnie. –

+0

@Groo: Tak, to oczywiście –

Odpowiedz

10

To nie tylko wyliczenie. Wyliczenia to tylko specjalne rodzaje zajęć. Ogólnie można zadeklarować wiele klas w jednym pliku (o ile żadne z nich nie jest publiczne).

+0

A nazwa pliku klasy może być dowolnie wybrana (np. MyClass.java dla przykładu). –

+0

Całkowicie przegapiłem fragment zatytułowany "Emocje to tylko specjalne rodzaje zajęć", mając na uwadze, że zaczyna to mieć sens. –

+0

Właściwie to działa na zajęcia (nie tylko wyliczenia). –

0

Kompiluje się właściwie na moim Eclipse! ;-)

Kilka klas może znajdować się w tym samym pliku. Ograniczeniem jest to, że klasa publiczna musi być zdefiniowana w pliku o tej samej nazwie.

Widoczność to "paczka", więc powinna być widoczna również w innych klasach w tym samym pakiecie.

Co mogę zrobić z tym wyliczeniem?

Można zrobić cokolwiek chcesz z powyższych ograniczeń ...

Uwaga: chociaż trzeba było to źle, że nie powinien czuć się tak źle, bo to naprawdę nie jest dobra praktyka zarówno. W naszej konfiguracji CheckStyle zewnętrzne klasy w tym samym pliku są traktowane jak błędy !!

+1

oczywiście kompiluje. Myślę, że OP zrozumiał, że kompiluje (ale nie było to jasne). – newacct

+0

Tak, wiem, powinienem wyjaśnić to w moim pytaniu. –

6

Nie, bez modyfikatora dostępu, enum jest pakietem prywatnym. Oznacza to, że może on być używany tylko przez klasy w tym samym pakiecie. Możesz to zrobić nie tylko dzięki wyliczaniu, ale także w klasach prywatnych.

Więcej informacji: http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

+1

Ignorując długie ramię Odbicia. – kenny

+0

@Kenny, bardzo prawdziwe! ;) –

1

Czasami ten idiom może być sensowne - na przykład wyobrazić masz UploadHandler klasę (czy coś takiego), który może powrócić do stanu z przesłania. Wydaje mi się całkiem wykonalne, aby zaimplementować ten status jako wyliczenie - i ponieważ enum (np. UploadStatus) wyraźnie "należy" do klasy UploadHandler, wydaje się, że dobrze jest zadeklarować go w tym samym pliku źródłowym. (Oczywiście zakłada się, że musi on być tylko pakietem prywatnym - jeśli jest naprawdę publiczny, musiałby zostać zadeklarowany we własnym pliku, co prawdopodobnie miałoby sens, jeśli nie jest już czymś wewnętrznym).

Tak się składa, że ​​w tym przypadku prawdopodobnie stałbym się wewnętrzną klasą statyczną, aby związek był bardziej wyraźny. Jednak deklarowanie wielu klas w tym samym pliku źródłowym nie zawsze jest złe i czasami może pomóc w czytelności przez ustawienie oczekiwań, że jest to banalna, podrzędna klasa pomocnicza.(Z tego samego powodu, nie sądzę, że takie klasy powinny robić coś szczególnie złożonego lub nieoczekiwanego.)

0

Wyliczenie określa listę stałych wartości, które można przypisać do określonego typu. Może być w klasie lub poza nią.

Powiązane problemy