Soru iç yuvalanmış enum'dan dış sınıfa erişme


Dışarıya Erişmenin Bir Yolu Var mı?

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);
        }
    }
}

18
2017-12-10 16:34


Menşei


Bir örneğine ihtiyacın var OuterClass Bir örnek yöntemini çağırmak için. - Dave Newton
tam olarak ne yapmak istiyorsun? - Android-Droid


Cevaplar:


Eric'in dediği gibi, enumlar kapalı bir şekilde statiktir. İstediğinizi yapmak için bir yöntem ekleyin callOuterMethod(OuterClass oc) Bu çağırır oc.outerMethod(data) istediğini yapmak için:

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

    final String data;

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

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

15
2017-12-10 17:09





Bunu yapamam. Enum, bildirilmese bile örtük olarak statiktir. Benzer sorulara / cevaplara bakın:

"İç içe enum türleri örtük olarak statiktir. İç içe bir bildirimde bulunmak açıkça izin verilebilir. enum türü statik olacak. "

Java'da, bir sınıf statik içinde enum türleri nelerdir?


7
2017-12-10 16:42





Nesne örneklerini çeşitlerle karıştırdığınızı düşünüyorum. Bildirdiğiniz iki yuvalanmış tiptir. Bu iki yuvalanmış nesne örneği ile aynı değildir.

Anahtar kelime this Türlerle çalışırken hiçbir anlamı yoktur. Sadece nesne örnekleri ile uğraşırken anlam kazanır. Yani, iç türden dış tip bir örnek yöntemini çağırmaya çalışıyorsanız, o zaman dış türün bir örneğine bir başvuru gerekir.

Ancak, dış tip statik yöntemini yaparsanız, dış türdeki bir örneğe başvurmaya gerek kalmadan statik yöntemi iç içe türden çağırabilirsiniz. Bunu yaparsanız, yöntemin "tüm örnekler için aynı" olduğunu ve yani OuterClass'ın tüm örnekleriyle herhangi bir durumu paylaştığını, böylece yalnızca türün statik üyelerine erişebileceğini unutmayın.

Aşağıdaki örnekte, outerMethod Statik olarak bildirilir ve böylece OuterClass örneğine başvuru gerekmeden iç içe türden çağrılabilir. Ancak, bunu yaparak, özel örnek üyesine artık erişemez data (bir örneğe başvurmadan). Statik bir üye bildirebilirsin staticData ve bunun yerine, ancak bu üyenin OuterClass'ın tüm örnekleriyle ve tüm ExternalMethod çağrılarıyla paylaşılacağını unutmayın.

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's 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);
        }
    }
}

3
2017-12-10 16:40



Aslında bu sözdizimi, içsel sınıftan, yani statik olmayan iç içe geçmiş, anonim veya yerel sınıftan örtülü türün örneğine örtük başvuruyu erişmek için kullanılır. Yuvalanmış enum statik iç içe geçmiş bir sınıf olduğundan, örneklerinin böyle bir başvurusu yoktur. - Darth Beleg