2009-10-01 86 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指定一个可以分配给特定类型的常量值列表。 它可以在课堂内部或外部。