我希望在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() {
...
}
答案 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实例的要求。