Подтвердить что ты не робот

Вложенный/Внутренний класс во внешнем файле

У меня есть класс MyClass и внутренний класс MyNestedClass следующим образом:

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

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

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

4b9b3361

Ответ 1

Вы можете сделать внутренний пакет класса приватным, что означает, что он будет доступен только из других классов в точно таком же пакете. Это также делается довольно часто для скрытых классов внутри стандартных пакетов 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., но вы получите по существу ту же функциональность, что и раньше, когда ссылка на внешний экземпляр была синтетически создана компилятором.

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

MyClass.java

public class MyClass {
  public abstract class CascadeJumper {}
}

MyNestedClass

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

С уважением

Ответ 6

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

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