Вложенный/Внутренний класс во внешнем файле
У меня есть класс MyClass
и внутренний класс MyNestedClass
следующим образом:
public class MyClass {
...
public class MyNestedClass {
...
}
}
Оба класса очень длинные. Из-за этого я хотел бы разделить их в двух разных файлах, не нарушая иерархию. Это связано с тем, что вложенный класс не должен быть видимым программисту, который использует MyClass.
Есть ли способ достичь этого?
Ответы
Ответ 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
Вы можете создавать абстрактные базовые классы, которые вы расширяете в обоих.
Однако, если эти классы большие, вам может быть лучше переоценить дизайн вашего класса и посмотреть, можете ли вы реорганизовать классы, которые представляют одну проблему.