У меня есть интерфейс (Node
), который реализуется двумя классами: White
, который я хочу быть одноэлементным, и Black
, а не синглом. Проблема в том, что я хочу, чтобы эти классы были заключены внешним классом (Outer
), который имеет собственное поле (outerObject
). White
должен быть одиночным, что означает, что он должен быть статичным. Но Black
должен иметь возможность доступа к внешним классам, что означает, что он не может быть статическим.Java Доступ к внешним переменным класса из внутреннего класса singleton
Здесь, если White
не статична, то это на самом деле не синглтон:
class Outer {
interface Node {
Node foo();
}
// I would like the White class to be a singleton class
class White implements Node {
Node foo() {
return new Black();
}
}
class Black implements Node {
Node foo() {
outerObject.doSomething();
return this;
}
}
Object outerObject;
}
Но если я White
статический синглтон, то она не может создавать новый Black
без объемлющей Outer
:
enum White implements Node {
INSTANCE;
Node foo() {
return new Black(); // This doesn't work because Black
// needs an enclosing outer class.
}
}
И если я должен был сделать Black
статическим классом, то он не сможет получить доступ к полю (outerObject
) во внешнем классе:
static class Black implements Node {
Node foo() {
outerObject.doSomething(); // can't access non-static field
return this;
}
}
Более простое представление, которое захватывает ту же проблему просто пытается получить доступ к outerObject
из одноэлементных White
:
class Outer {
enum White {
INSTANCE;
Node foo() {
outerObject.doSomething();
return this;
}
}
Object outerObject;
}
я должен был бы сделать White
нестатическими, чтобы иметь возможность получить доступ к outerObject
, но он должен быть статичным, чтобы быть одноточечным.
Кто-нибудь знает, есть ли решение? Если дело доходит до него, я могу попытаться создать псевдо-одиночный внутренний класс (в том смысле, что каждый экземпляр внешнего класса может иметь только один экземпляр этого внутреннего класса). Или просто выровняйте одноэлементный шаблон и вручную объявите только один White
.
Я думаю, что вы можете быть слишком сложными. Зачем вам нужна такая структура? –
defenceThere нет пути вокруг этого кроме изменения вашего дизайна. Статический внутренний класс не привязан к конкретному экземпляру внешнего класса, поэтому он не может создать экземпляр нестатического внутреннего класса, так как ** ** привязан к определенному внешнему экземпляру. –
Спасибо за быстрый ответ! Я пытаюсь реализовать квадратное дерево. EDIT: Квадратное дерево хранит точки и линии в качестве содержимого. Узлы 'White' означают, что в этом ничего нет. Узлы «черного» означают, что в ней есть одна точка. Есть также узлы «Grey», но я оставил их вне вопроса для ясности. – Hau