Вариант использования похож на приведенный ниже код. Существует класс (Inner_Demo) внутри другого класса (Outer_Demo). Inner_class будет создан при некотором условии в частном методе внешнего класса.
class Outer_Demo {
public Outer_Demo() {
test();
}
// private method of the outer class
private void test() {
Inner_Demo demo;
if (condition)
demo = new Inner_Demo();
}
// inner class
class Inner_Demo {
}
}
main(){
Outer_Demo outer = new Outer_Demo();
// Here I need to check is Inner class got instantiated
// Trying to print the value as below leads to error create
// field/constant Inner_Demo in Outer_Demo
System.out.println(Outer_Demo.Inner_Demo); // outer.Inner_Demo
/* Storing the created instance to Outer_Demo.Inner_Demo
is allowed */
Outer_Demo.Inner_Demo inst = outer.new Inner_Demo();
System.out.println(inst);
}
Мне нужно проверить, создан ли внутренний класс или нет. Я узнал, что вызов внутреннего класса вышеописанным способом неверен.
Отражение могло бы использоваться, если поле демо в методе тестовое задание класса Внешний_Demo не является локальным/имеет доступ на уровне класса. Может ли кто-нибудь помочь мне понять, есть ли способ найти статус внутреннего класса. Любые ссылки на тему полезны. Спасибо.




Возможно, вы захотите проверить, был ли создан экземпляр объекта этого класса.
Для этой задачи вы должны объявить поле Inner_Demo в своем классе Outer_Demo:
class Outer_Demo {
public Outer_Demo() {
test();
}
Inner_Demo innerDemo;
...
Теперь каждый раз, когда создается экземпляр объекта, этому полю должно быть присвоено значение:
innerDemo = new Inner_Demo();
И, наконец, когда вы хотите проверить, существует ли объект, вы просто делаете это так:
if (innerDemo == null) {
//object does not exist yet and has to be instantiated
} else {
//object does exist and can be used
}
Поле является локальным для метода? Это не поле. это просто ссылка на объект, который удаляется после возврата из метода. Если вы имеете в виду «Я не хочу делиться объектом, я просто хочу знать, существует ли он», то вместо поля Inner_Demo объявите простое логическое поле. И устанавливайте его в true каждый раз, когда создается экземпляр объекта. В остальном то же самое. И кстати, если вы не разделяете объект... интересно, какой смысл его создавать...?
«если он существует» не имеет смысла в данном контексте. Без ссылки на объект объект не существует. И если существование объекта не имеет видимого побочного эффекта (который приложение может проверить), нет смысла говорить, что может существовать только один объект. Судя по всему, это все равно не имеет значения.
Спасибо за ответ. Как я уже упоминал в вопросе, это поле является локальным для метода, и это сделано по некоторым соображениям безопасности. Как вы упомянули, если у него есть доступ на уровне класса, получить ценность для нас просто. Я не могу изменить родительский код. Любым другим путем?