Вложенный / Внутренний класс во внешнем файле - PullRequest
35 голосов
/ 02 июня 2011

У меня есть класс MyClass и внутренний класс MyNestedClass, например:

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

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

Есть ли способ достичь этого?

Ответы [ 6 ]

21 голосов
/ 02 июня 2011

Вы можете сделать пакет внутреннего класса приватным, что означает, что он будет доступен только для других классов в том же пакете. Это также делается довольно часто для скрытых классов внутри стандартных пакетов JDK, таких как java.lang или java.util.

в pkg / MyClass.java

public class MyClass {
  ...
}

в pkg / MyHiddenClass.java

class MyHiddenClass {

  final MyClass outer;

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

Теперь, когда вы хотите получить доступ к методам или переменным внешнего класса, вам нужно добавить к ним префикс outer., но вы получите, по существу, те же функциональные возможности, что и раньше, когда компилятор создал ссылку на внешний экземпляр. *

6 голосов
/ 02 июня 2011

Нет.Исходные коды Java не могут быть разбиты на несколько файлов.Вам потребуется конструкция, аналогичная частичному классу, как в C #, которого нет в Java.

5 голосов
/ 02 июня 2011

Объекты внутренних классов сохраняют неявные ссылки на объекты класса paren. Если вложенный класс не static (он внутренний), вы не можете. Но если вложенный класс не нуждается в непосредственном доступе к экземплярам родительского класса и не нуждается в доступе к закрытым полям, то для рефакторинга все в порядке, переместите внутренний класс и выполните not , объявив его открытым ( из этого пакета невозможно получить доступ).

4 голосов
/ 03 июня 2011

я думаю, что у вас есть объект бога или что-то подобное, подумайте рефакторингом вашего кода

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

3 голосов
/ 17 октября 2016

Да, используя каскадный джампер. Каскадный перемычка - это абстрактный и нестатический внутренний класс, который определен где-либо еще.

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 голос
/ 02 июня 2011

Вы можете создавать абстрактные базовые классы, которые вы расширяете в обоих.

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

...