3

「MyMethod」という名前のインターフェースを持つシステムを実装しています(名前は任意です)。多くの小さなクラスがこのメソッドを実装しています(具体的には「call」メソッドをオーバーライドするため)。ポリモーフィズムを使用して作成していますこれらのインスタンスをリストに。

問題は、メソッドを実装するこれらの小さなクラスがたくさんあるので、次のように、これらのクラスを同じ Java ファイル (MyMethod.java) に配置する方が簡単だったということです。

public interface MyMethod {
    public String call(foo param1, bar param2) throws SQLException, IOException;
}

class FooMethod1 implements MyMethod {
    @Override
    public String call(foo param1, bar param2) throws SQLException, IOException {
        //Do Something
    }
}

class FooMethod2 implements MyMethod {
    @Override
    public String call(foo param1, bar param2) throws SQLException, IOException {
        //Do Something Different
    }
}

ただし、これらのクラスを同じファイルに入れると、すっきりとは言え、Java で行うべき方法に反対しているように思えます。

これらのクラスを同じファイルに入れても大丈夫ですか? または、それぞれを別のファイルに移動する必要がありますか?

ありがとう

4

1 に答える 1

6

はい、同じファイルに複数のパッケージプライベートクラスを入れてもかまいません。

JLSの関連セクションは§7.3です

CompilationUnit:
    PackageDeclaration[opt] ImportDeclarations[opt] TypeDeclarations[opt]

TypeDeclarations:
    TypeDeclaration
    TypeDeclarations TypeDeclaration

ご覧のとおり、コンパイルユニットには複数の型宣言(またはゼロ)が含まれている場合があります。JLSのもう1つの関連セクションは、§7.6です。コンパイルユニットの外部からアクセスされるこれらの型宣言と、コンパイルユニットのファイル名との相関関係について説明します。

パッケージがファイルシステムに保存されている場合(§7.2)、ホストシステムは、タイプ名で構成される名前のファイルにタイプが見つからない場合、コンパイル時エラーであるという制限を適用することを選択できます。さらに、次のいずれかに該当する場合は、拡張子(.javaや.javなど)を追加します。

  • 型は、型が宣言されているパッケージの他のコンパイル単位のコードによって参照されます。

  • タイプはパブリックとして宣言されます(したがって、他のパッケージのコードからアクセスできる可能性があります)。

この制限は、コンパイル単位ごとに最大で1つのそのようなタイプが存在する必要があることを意味します。この制限により、Javaコンパイラはパッケージ内の名前付きクラスを簡単に見つけることができます。実際には、多くのプログラマーは、パブリックであるか、他のコンパイルユニットのコードによって参照されているかに関係なく、各クラスまたはインターフェイスタイプを独自のコンパイルユニットに配置することを選択します。

明らかに、あなたのアプローチはJavaに反するものではなく、完全に問題ありません。ただし、コンパイラの実装によっては、コンパイルユニットMyMethodの外部で実装を使用できない場合があることに注意してください。MyMethod.javaただし、javacEclipseコンパイラもこれに問題があるようには見えません...

于 2012-11-27T10:51:59.363 に答える