2009-10-01 83 views
12

我參加了這次面試,獲得了一個軟件開發人員的職位,他們給了我一些測試代碼,通常有4個選項可供選擇。
其中一個問題在類範圍外聲明瞭一個枚舉,我立即檢查了「不編譯」答案並繼續處理其他問題。 它是這樣的:在課堂範圍外聲明的Enum

enum Colors {BLUE,RED,GREEN} 

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

此代碼實際上編譯。
除了像這樣的一個採訪(可能或者)可能沒有用來確定一個人是否是一個優秀的開發人員,我擔心的是:爲什麼我要聲明這樣的枚舉?爲什麼我只能使用枚舉來做到這一點? 我做了一些測試,發現它在課堂上是可見的,但不是其他課程。

旁註:我得分很差:P。我在理論上獲得了最大值,但在角落代碼情況下接近最低可能值。我不認爲我會得到這份工作。

+3

它將在同一個命名空間中的其他類中顯示,而不僅僅在一個文件中。 BCL中的大多數枚舉都是在類之外聲明的,就像您提供的示例(除了它們是公共的)。 所以問題是爲什麼*不會*你宣佈這樣的枚舉? – Groo 2009-10-01 10:17:35

+0

檢查是否有人使用java訪問控制並且類不是表單public class A {private String field;公共方法(){}}默認情況下。 – 2009-10-01 10:49:10

+0

@格羅:是的,當然是編譯 – 2009-10-01 11:04:52

回答

10

這不僅僅是枚舉。枚舉只是特殊的類。一般而言,您可以在一個文件中聲明多個類(只要其中沒有兩個是公共的)。

+0

可以自由選擇類文件名(例如MyClass.java)。 – 2009-10-01 10:44:58

+0

我完全錯過了「Enums僅僅是特殊的類」這一段,考慮到這一點,這開始有意義。 – 2009-10-01 11:02:44

+0

其實這適用於類(不只是枚舉)。 – 2009-10-01 16:51:07

0

它實際上編譯在我的Eclipse上! ;-)

允許幾個類在同一個文件中。限制是公共類必須在具有相同名稱的文件中定義。

它的可見性是'包',所以它應該可以在同一包中的其他類中看到。

我該如何處理這個枚舉?

你可以做你想做上述限制什麼...

注:雖然你有錯,你不應該感到太糟糕了,因爲它不是一個真正的好的做法無論是。在我們的CheckStyle配置中,像這樣的文件中的外部類被視爲錯誤!

+1

。我認爲OP意識到它編譯(但不清楚) – newacct 2009-10-01 10:09:23

+0

是的,我知道,我應該在我的問題中澄清它。 – 2009-10-01 10:10:05

6

不,沒有訪問修飾符,枚舉是包私有的。這意味着它只能由相同包中的類使用。你不僅可以通過枚舉來實現這一點,類也可以被封裝爲私有。

更多信息:http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

+1

忽略反射的長臂。 – kenny 2009-10-01 10:45:41

+0

@肯尼,非常真實! ;) – 2009-10-01 11:25:14

1

有時候這個成語可以明智的 - 例如,假設你有一個UploadHandler類(或類似的東西),它可以從上傳返回一個狀態。把這個狀態作爲一個枚舉實現似乎是非常可行的 - 由於枚舉(例如UploadStatus)顯然「屬於」UploadHandler類,所以在同一個源文件中聲明它似乎很好。 (這當然假定它只需要是包私有的 - 如果它是真正公開的,它將需要在它自己的文件中聲明,如果它不再是內部的東西,這可能是有意義的)。

碰巧,在這種情況下,我可能會讓它成爲一個靜態的內部類,使關係更加明確。但是在同一個源文件中聲明多個類並不總是很糟糕,並且通過設置這是一個邊界不重要的子類的期望,有時可以提高可讀性。(同樣,我認爲這樣的類不應該做任何特別複雜或意外的事情。)

0

enum指定一個可以分配給特定類型的常量值列表。 它可以在課堂內部或外部。