项目构造函数中的Java Enum私有方法

时间:2012-11-30 07:50:19

标签: java enums inner-classes

public enum Parent {
    item1(1){

        public void testing() {
            add();
            multiply();
            minus(); // error here!!!
        } 

    }, item2(2);

    private int i ;
    Parent(int i){
        this.i = i;
    }

    public void setI(int i ){
        this.i = i;
    }
    public int getI(){
        return i;
    }

    public void multiply(){

    }
    protected void add(){

    }

    private void minus(){

    }
}

正如你们所看到的,他们在同一个班级,minus()怎么不能在内部使用?通常内部类可以访问外部类中的private method/field吗?

3 个答案:

答案 0 :(得分:8)

为了能够从minus()访问item1,您必须protected(或public)。

考虑Parentitem1的正确方法是作为基类和子类。

来自JLS

  

枚举常量的可选类主体隐式定义了一个匿名类声明(第15.9.5节),它扩展了直接封闭的枚举类型

答案 1 :(得分:3)

实际上,当您在创建枚举对象时提供实现时会发生什么,您基本上是使用额外的方法扩展Parent类,即 Annonymous 实现。因此,它不允许访问Parent类的私有方法,但允许protectedpublic

enum A{
        a{
            @Override
            public void method() {
                // TODO Auto-generated method stub
                super.method();
            }
        };


        public void method(){

        }
    }

这应该解释一下eclipse提供的@Override注释。

答案 2 :(得分:1)

问题是" item1"它不是Parent的内部类,它实际上是顶级类。要验证是否看到item1的生成类,它是Parent $ 1.class,如果它是内部类,它将是Parent $ item1.class