次のようなクラスMyClass
と内部クラスMyNestedClass
があります。
public class MyClass {
...
public class MyNestedClass {
...
}
}
どちらのクラスも非常に長いです。そのため、階層を壊さずに、2つの異なるファイルにそれらを分離したいと思います。これは、ネストされたクラスがMyClassを使用するプログラマーに表示されるべきではないためです。
それを達成する方法はありますか?
内部クラスパッケージをプライベートにすることができます。これは、まったく同じパッケージ内の他のクラスからのみアクセスできることを意味します。これは、Java.lang
やJava.util
などの標準JDKパッケージ内の非表示クラスに対しても頻繁に実行されます。
pkg /MyClass.Java内
public class MyClass {
...
}
pkg /MyHiddenClass.Java内
class MyHiddenClass {
final MyClass outer;
MyHiddenClass( MyClass outer )
{
this.outer = outer;
}
...
}
ここで、外部クラスのメソッドまたは変数にアクセスする場合は、接頭辞outer.
を付ける必要がありますが、外部インスタンスへの参照がコンパイラーによって合成的に作成されたときと基本的に同じ機能が得られます。
いいえ。Javaソースコードを複数のファイルに分割することはできません。C#のように部分クラスに似た構造が必要ですが、Java持ってる。
innerクラスのオブジェクトは、parenクラスのオブジェクトへの暗黙の参照を保持します。 nestedクラスがstatic
(内部)でない場合はできません。ただし、ネストされたクラスが親のクラスインスタンスに直接アクセスする必要がなく、プライベートフィールドにアクセスする必要がない場合は、リファクタリングして内部クラスを移動し、not宣言する必要があります。 (そのパッケージからはアクセスできません)。
私はあなたが神オブジェクトかそのようなものを持っていると思います、あなたのコードをリファクタリングすることを考えてください
はい、カスケードジャンパーを使用しています。カスケードジャンパーは、他の場所で定義されている抽象的で非静的な内部クラスです。
MyClass.Java
public class MyClass {
public abstract class CascadeJumper {}
}
MyNestedClass
private class MyNestedClass extends MyClass.CascadeJumper {
MyNestedClass(MyClass dollarOne) {
dollarOne.super(); // yes, is possible!
}
}
よろしく
両方で拡張する抽象基本クラスを作成できます。
ただし、これらのクラスが大きい場合は、クラスの設計を再評価して、それぞれ1つの懸念事項を表すクラスにリファクタリングできるかどうかを確認することをお勧めします。