2009-10-01 13 views
12

私はソフトウェア開発者の立場でこのインタビューに行きました。彼らは私にいくつかのコーナーケースコードの状況をテストしました。
質問の1つにenumがクラススコープ外で宣言されていましたが、すぐに「コンパイルできません」という回答をチェックし、他の質問に進みました。このコードは、実際にコンパイルクラスのスコープ外に宣言された列挙型

enum Colors {BLUE,RED,GREEN} 

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

: それはのようなものでした。
このようなインタビューが良い開発者であるかどうかを調べるのに役立たないかもしれないという事実の他に、私が心配しているのは、なぜこのようなenumを宣言するのだろうか?なぜ私は列挙型でこれを行うことができますか? 私はいくつかのテストを行い、それがクラス内では見えるが他のクラスでは見えないことを発見しました。

サイドノート:私は本当に貧しい人々を獲得しました。私は理論を最大にしましたが、コーナーケースコードの状況では可能な限り近くでした。私は仕事を得るとは思わない。

+3

ファイル内だけでなく、同じ名前空間内の他のクラスからも可視になります。 BCLのほとんどの列挙型は、あなたが提供した例のように、クラス外で宣言されています(ただし、それらは公開されています)。 なぜこのようなenumを宣言しないのですか? – Groo

+0

javaアクセスコントロールで作業していて、クラスがpublic class A {private Stringフィールドの100%ではないことを確認すると便利です。パブリックメソッド(){}}。 –

+0

@Groo:はい、もちろんそれは –

答えて

10

enumだけではありません。 Enumは特別なクラスのクラスです。一般に、1つのファイルで宣言された複数のクラスを持つことができます(ただし、2つのクラスが公開されていない場合)。

+0

クラスファイル名は自由に選択できます(例としてMyClass.javaなど)。 –

+0

「Enumはちょうど特別な種類のクラスです」ということを完全に逃しました。 –

+0

これは実際にクラス(列挙型だけでなく)に対して機能します。 –

0

私のEclipseでは実際にコンパイルされます! ;-)

いくつかのクラスは同じファイルに存在することができます。制限は、パブリッククラスを同じ名前のファイルに定義する必要があるということです。

可視性は 'パッケージ'なので、同じパッケージ内の他のクラスでも表示する必要があります。

私はその列挙体で何ができますか?

あなたは上記の制限にしたい何かを行うことができます...

注:あなたはそれが間違っていたが、それは本当に良い練習はないので、あなたは、あまりにも悪い感じてはいけませんどちらか。 CheckStyleの設定では、このような同じファイル内の外部クラスはエラーとして扱われます!!

+1

です。私はOPがコンパイルされていることに気がついたと思う(しかしそれについてはっきりしていなかった) – newacct

+0

はい、私は知っている、私は私の質問でそれを明確にする必要があります。 –

6

いいえ、アクセス修飾子を使用しない場合、enumはpackage-privateです。つまり、同じパッケージ内のクラスでのみ使用できます。そして列挙型でこれを行うだけでなく、クラスをパッケージプライベートにすることもできます。

さらに詳しい情報:

+1

反射の長い腕を無視する。 – kenny

+0

@ケニー、本当です! ;) –

1

http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.htmlは時々、このイディオムは賢明なことができます - たとえば、あなたがアップロードからのステータスを返すことができます(そのようか何か)UploadHandlerクラスを持っている想像してみてください。この状態を列挙型として実装することは可能です.Enum(例:UploadStatus)がUploadHandlerクラスに「所属」しているため、同じソースファイルで宣言しても問題ありません。 (これはもちろん、パッケージプライベートである必要があると仮定します。本当に公開されている場合は、独自のファイルで宣言する必要があります。これは内部のものではない場合にはおそらく意味があります)。

この場合、私はおそらくそれをより明示的な関係にするために静的な内部クラスにします。しかし、同じソースファイル内に複数のクラスを宣言することは必ずしも悪くないわけではなく、時にはこれが境界線のない従属クラスであるという期待を設定することによって可読性を助けることができます。(同じように、私はこのようなクラスは、特に複雑で予期しないことをする必要はありません)

0

enumは、特定の型に割り当てることができる定数値のリストを指定します。 クラスの内部または外部のどちらでもかまいません。

関連する問題