Попробуйте следующее ...
- Передать ссылку внешнего класса на no-long-inner-class
- Используйте пакеты и сделайте пакет больше не внутренним классом приватным (ответ Джереми)
- В очень редких случаях может быть лучше пойти с внутренними классами, и в то же время заставить их работать в другом месте. Если это действительно вы, пожалуйста, читайте дальше ...
Как сохранить внутренние классы маленькими
а) Расширение от внешних классов
class Outer {
class SomeInnerClass extends SomeClass {
// More specific code here
}
}
class SomeClass {
// A lot of generic code here (in a different file)
}
б) Используйте абстрактные методы
Одна из (более правильных) причин использования внутренних классов, как правило, связана с использованием точного экземпляра внешнего класса. Для общего решения этого вопроса в базовом классе используйте абстрактные методы получения.
abstract class SomeClass {
protected abstract SpecificData getSpecificData();
void someMethod() {
SpecificData specificData = getSpecificData();
// Do work with the "specific data" here ...
}
}
class Outer {
private SpecificData mSpecificData = new SpecificData();
class SomeInnerClass extends SomeClass {
@Override
protected SpecificData getSpecificData() {
return OuterClass.mSpecificData;
}
}
}
Я думаю, что вы поняли идею ... Вы могли бы также рассмотреть использование некоторого класса или интерфейса GeneralData
(в пределах SomeClass
) вместо этого, и сделать так, чтобы getSpecificData()
возвратил более конкретный (убывший) его экземпляр.
Опять же: это может быть ужасно неправильно использовано для создания очень плохого нечитаемого кода, но оно также может быть использовано для очень хороших скороговорок при правильных обстоятельствах, в любом случае оно должно отвечать на исходный вопрос.