2012-02-20 37 views
1

我希望做这样的事情在Java中:是否可以实例化一个类并将它赋予Java中的单个语句中的成员变量?

public OuterClass { 

    public innerClass = new Object() { 
     private var1; 

     public void myMethod() { 
      ... 
     } 
    } 

} 

,并使用它像这样:

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

的原因是为了basiclly命名空间内的在OuterClass一些方法,以保持组织的事情。

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

这woule类似于下面的JavaScript:

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

你有没有考虑过Singleton设计模式? – 2012-02-20 16:38:50

+0

号码虽然内部类需要访问outclass的成员变量。 – Camsoft 2012-02-20 16:41:48

回答

2

你在问题标题中提出的问题是可能的,但不幸的是不是你真正想要的。

在您的代码中,innerClass字段声明的行忽略该字段的类型。其余代码不变,只有一种可能性:Object

所以,你的代码会读这样的:

其实,这是可能的,但调用该方法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分成真正的共存类(当然这可能会引用对方,并可能访问包私有成员)。

+0

这是总的意义。谢谢。 – Camsoft 2012-02-20 16:58:01

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的多个实例。

相关问题