是否可以实例化一个类并将其分配给Java中单个语句中的成员变量?

时间:2012-02-20 16:36:08

标签: java class

我希望在Java中做这样的事情:

public OuterClass {

    public innerClass = new Object() {
        private var1;

        public void myMethod() {
           ...
        }
    }

}

并像这样使用它:

OuterClass outer = new OuterClass();
outer.innerClass.myMethod();

原因是在OuterClass中基本命名一些方法以保持组织有序。

我知道我可以创建一个innerClass实例并将其分配给OuterClass的公共实例变量,但我正在寻找一种内联方式来实现它,如上例所示。我不希望它能够多次实例化innerClass,因此内联方法。

这个类似于以下JavaScript:

var innerObject = new function() {
   ...       
}

2 个答案:

答案 0 :(得分:2)

你在问题​​标题中提到的内容是可能的,但遗憾的是不是你真正想要的内容。

在您的代码中,带有字段innerClass声明的行错过了该字段的类型。如果其余代码保持不变,则只有一种可能性:Object

所以你的代码会这样读:

public OuterClass {

    public Object innerClass = new Object() {
        private var1;

        public void myMethod() {
           ...
        }
    }
}

这实际上是可行的,但调用方法myMethod是不可能的。当您访问outer.innerClass时,此表达式的类型为Object,其中没有方法myMethod,因此代码将无法编译。

但是,您可以引入界面MyInnerInterface

interface MyInnerInterface {
    void myMethod();
}

并将字段类型更改为MyInnerInterface

public OuterClass {

    public MyInnerInterface innerClass = new MyInnerInterface() {
        private var1;

        public void myMethod() {
           ...
        }
    }
}

然后可以访问该方法。但是你有额外接口的缺点。

此代码也很不寻常,我认为不好。如果你真的想在这里有一个内部类,不要使用匿名类,而是使用真正的类:

public OuterClass {

    public class InnerClass  {
        private var1;

        public void myMethod() {
           ...
        }
    }

    public InnerClass innerClass = new InnerClass();
}

尽管如此,使用内部类来从外部进行“范围”访问是我不会做的事情。内部类通常应该是外部类的实现细节,而不是公众可访问的。更好地考虑如何将您的API分成真正的共存类(当然可能相互引用,并可能访问包私有成员)。

答案 1 :(得分:0)

你试过了吗?

public class OuterClass {

    public static void main(String[] args) {
        OuterClass o = new OuterClass();
        o.new InnerClass().method();
    }

    class InnerClass {

        public void method() {
            //do something
        }
    }
}

它使用您建议的语法,但不能满足您不需要多个InnerClass实例的要求。