Javaでは、内部クラスが外部クラスを拡張する場合があります。
たとえば、java.awt.geom.Arc2D.Floatはjava.awt.geom.Arc2Dの内部クラスであり、Arc2Dも拡張します。(http://download.oracle.com/javase/6/docs/api/java/awt/geom/Arc2D.Float.htmlを参照)
また、sun.org.mozilla.javascript.internal.FunctionNode.Jumpは、FunctionNodeのスーパークラスであるsun.org.mozilla.javascript.internal.Nodeを拡張します。(申し訳ありませんが... javadocへのリンクが見つかりません)
私には、これは奇妙に思えます。次に、これらを作成できますか?
new Arc2D.Float.Float() //n.b. I couldn't get this to compile in Intellij IDEA;
new FunctionNode.Jump.Jump.Jump(1); // I could get this to compile
サブクラスをスーパークラスの内部クラスとしてネストすることは、どのような目的に役立ちますか?
スーパークラスの何かにアクセスするのかどうか疑問に思いましたが、親の変数/メソッドにアクセスしたい場合は、
super.variable;
また
super.method();
編集1:jjnguyは、ロジックを同じ場所に保持することを提案しました。その場合、なぜファイルcom.mypackage.AbstractTestを作成しないのでしょうか。
abstract class AbstractTest {
abstract String getString();
}
class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
... それよりも:
abstract class AbstractTest {
abstract String getString();
class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
}
編集2:パッケージの外部でExtensionTestを構築できなかったため、以前の編集での提案に欠陥があることが正しく指摘されています。しかし、私は週末にこれについてさらに考えたので、次はどうですか?
abstract class Test {
public class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
private abstract class AbstractTest {
abstract String getString();
}
}
本質的に、私がこれまでに見た最良の答えは、内部クラスにその外部クラスを拡張させることで、ロジックをグループ化できるということです。ただし、これは拡張なしで実行できると思います。
私の考えでは、同じサブクラスを無限にネストできるクラスを作成するのは悪い設計のようです。(コンテキスト:これは、コード補完ユーティリティの辞書を作成しようとしたときに発生し、StackOverflowExceptionをスローしました。回避策を見つけましたが、なぜそのように設計されたのか理解できません。)