2013-02-26 6 views
0

У меня есть интерфейс (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.

+3

Я думаю, что вы можете быть слишком сложными. Зачем вам нужна такая структура? –

+0

defenceThere нет пути вокруг этого кроме изменения вашего дизайна. Статический внутренний класс не привязан к конкретному экземпляру внешнего класса, поэтому он не может создать экземпляр нестатического внутреннего класса, так как ** ** привязан к определенному внешнему экземпляру. –

+0

Спасибо за быстрый ответ! Я пытаюсь реализовать квадратное дерево. EDIT: Квадратное дерево хранит точки и линии в качестве содержимого. Узлы 'White' означают, что в этом ничего нет. Узлы «черного» означают, что в ней есть одна точка. Есть также узлы «Grey», но я оставил их вне вопроса для ясности. – Hau

ответ

0

Вы можете указать, на каком этапе Outer вы хотите создать новый черный. Но, вероятно, это не то, что вы хотите.

enum White implements Node { 
     INSTANCE; 

     public Node foo() { 
      return new Outer().new Black(); // This will work 
     } 
    } 
+0

Я видел это раньше, но мне нужно, чтобы новый «черный» был заключен в ту же «Наружную», что и «Белый». Я знаю, что это невозможно, если «Белый» статичен. Возможно, существует еще одна нестатическая реализация одноэлементного шаблона. – Hau

Смежные вопросы