web-dev-qa-db-ja.com

外部ファイルのネストされた/内部クラス

次のようなクラスMyClassと内部クラスMyNestedClassがあります。

public class MyClass {
  ...
  public class MyNestedClass {
    ...
  }
}

どちらのクラスも非常に長いです。そのため、階層を壊さずに、2つの異なるファイルにそれらを分離したいと思います。これは、ネストされたクラスがMyClassを使用するプログラマーに表示されるべきではないためです。

それを達成する方法はありますか?

37
Alp

内部クラスパッケージをプライベートにすることができます。これは、まったく同じパッケージ内の他のクラスからのみアクセスできることを意味します。これは、Java.langJava.utilなどの標準JDKパッケージ内の非表示クラスに対しても頻繁に実行されます。

pkg /MyClass.Java内

public class MyClass {
  ...
}

pkg /MyHiddenClass.Java内

class MyHiddenClass {

  final MyClass outer;

  MyHiddenClass( MyClass outer )
  {
      this.outer = outer;
  }
  ...
}

ここで、外部クラスのメソッドまたは変数にアクセスする場合は、接頭辞outer.を付ける必要がありますが、外部インスタンスへの参照がコンパイラーによって合成的に作成されたときと基本的に同じ機能が得られます。

21
x4u

いいえ。Javaソースコードを複数のファイルに分割することはできません。C#のように部分クラスに似た構造が必要ですが、Java持ってる。

6
retrodrone

innerクラスのオブジェクトは、parenクラスのオブジェクトへの暗黙の参照を保持します。 nestedクラスがstatic(内部)でない場合はできません。ただし、ネストされたクラスが親のクラスインスタンスに直接アクセスする必要がなく、プライベートフィールドにアクセスする必要がない場合は、リファクタリングして内部クラスを移動し、not宣言する必要があります。 (そのパッケージからはアクセスできません)。

5
Op De Cirkel

私はあなたが神オブジェクトかそのようなものを持っていると思います、あなたのコードをリファクタリングすることを考えてください

http://en.wikipedia.org/wiki/God_object

4
osdamv

はい、カスケードジャンパーを使用しています。カスケードジャンパーは、他の場所で定義されている抽象的で非静的な内部クラスです。

MyClass.Java

public class MyClass {
  public abstract class CascadeJumper {}
}

MyNestedClass

private class MyNestedClass extends MyClass.CascadeJumper {
  MyNestedClass(MyClass dollarOne) {
    dollarOne.super(); // yes, is possible!
  }
}

よろしく

3
Peter Rader

両方で拡張する抽象基本クラスを作成できます。

ただし、これらのクラスが大きい場合は、クラスの設計を再評価して、それぞれ1つの懸念事項を表すクラスにリファクタリングできるかどうかを確認することをお勧めします。

1
rsp