доступ внешнего класса из внутреннего вложенного перечисления

Есть ли способ получить доступ к внешней стороне?

public class OuterClass  {
    String data;

    public void outerMethod(String data) {
         this.data = data;
    }

    public enum InnerEnum {
        OPTION1("someData"),
        OPTION2("otherData");

        InnerEnum(String data) {
              // Does not work:             
              OuterClass.this.outerMethod(data);
        }
    }
}

Ответ 1

Как сказал Эрик, перечисления неявно статичны. Чтобы сделать то, что вы хотите, добавьте метод callOuterMethod(OuterClass oc) который вызывает oc.outerMethod(data) чтобы делать то, что вы хотите:

public enum InnerEnum {
    OPTION1("someData"),
    OPTION2("otherData");

    final String data;

    InnerEnum(String data) {
       this.data = data;             
    }

    void callOuterMethod(OuterClass oc) {
        oc.outerMethod(data);
    }
}

Ответ 2

Не могу этого сделать. Перечисление неявно статично, даже если вы его не объявляли. См. Аналогичный вопрос/ответ:

"Вложенные типы перечислений неявно статичны. Разрешено явно объявлять вложенный тип перечисления статическим".

В Java, перечислены типы внутри статического класса?

Ответ 3

Я считаю, что вы смешиваете экземпляры объектов с типами. Вы объявили два вложенных типа. Это не то же самое, что два экземпляра вложенных объектов.

Ключевое слово this не имеет смысла при работе с типами. Это имеет смысл только при работе с экземплярами объектов. Итак, если вы пытаетесь вызвать метод экземпляра внешнего типа из внутреннего типа, вам нужна ссылка на экземпляр внешнего типа.

Однако, если вы создаете метод внешнего типа static, вы можете вызвать статический метод из вложенного типа, не требуя ссылки на экземпляр внешнего типа. Просто имейте в виду, что если вы это сделаете, метод будет "одинаковым для всех экземпляров" - это означает, что он разделяет любое состояние со всеми экземплярами OuterClass, поэтому он может получить доступ только к статическим членам типа.

В приведенном ниже примере outerMethod объявляется статическим, и поэтому он может быть вызван из вложенного типа без необходимости ссылки на экземпляр OuterClass. Однако, делая это, он больше не может обращаться к data частного члена экземпляра (без ссылки на экземпляр, конечно). Вы можете объявить статический член staticData и получить доступ к этому вместо этого, но просто имейте в виду, что этот член будет разделяться всеми экземплярами OuterClass и всеми вызовами outerMethod.

public class OuterClass  {

        String data;                 // instance member - can not be accessed from static methods
                                     //   without a reference to an instance of OuterClass

        static String staticData;    // shared by all instances of OuterClass, and subsequently
                                     //   by all invocations of outerMethod

        // By making this method static you can invoke it from the nested type 
        //  without needing a reference to an instance of OuterClass. However, you can
        //  no longer use 'this' inside the method now because it a static method of
        //  the type OuterClass
    public static void outerMethod(String data) {

            //this.data = data;  --- will not work anymore

            // could use a static field instead (shared by all instances)
            staticData = data;
    }

    public enum InnerEnum {
        OPTION1("someData"),
        OPTION2("otherData");

        InnerEnum(String data) {
                    // Calling the static method on the outer type
                    OuterClass.outerMethod(data);
        }
    }
}