Внутренний класс Java расширяет внешний класс

В 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 расширяет sun.org.mozilla.javascript.internal.Node, который является суперклассом FunctionNode. (извините ... не могу найти ссылку на 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();

Edit 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";
    }
  }
}

Edit 2: Правильно было указано, что предложение в моем предыдущем редактировании было ошибочным, так как не удалось создать ExtensionTest вне пакета. Однако на выходных я еще раз подумал об этом, так что насчет следующего:

abstract class Test {
  public class ExtensionTest extends AbstractTest {
    @Override
    String getString() {
      return "hello world";
    }
  }

  private abstract class AbstractTest {
    abstract String getString();
  }
} 

По сути, лучший ответ, который я видел до сих пор, заключается в том, что расширение внутреннего класса его внешнего класса позволяет логике быть сгруппированы вместе. Однако я думаю, что это можно сделать без расширения.

На мой взгляд, создание класса, который может иметь бесконечное количество вложенных в него подклассов, кажется плохим. (Контекст: это возникло при попытке создать словарь для утилиты завершения кода и вызвало исключение StackOverflowException. Я нашел обходной путь, но просто не могу понять, почему он был разработан таким образом.)

11
задан amaidment 22 August 2011 в 13:24
поделиться