【问题标题】:Defining custom function/property inside anonymous class在匿名类中定义自定义函数/属性
【发布时间】:2020-07-28 10:15:04
【问题描述】:

我想在匿名类中定义我的属性和函数

ExistingExtendableJavaClass aClass = new ExistingExtendableJavaClass() {
         public String someProperty;

         public String getMyProperty() { return someProperty }
});

但是这些调用不起作用

aClass.someProperty // not accessible
aClass.getMyProperty() // not accessible

我知道是因为ExistingExtendableJavaClass 没有这些,但我的匿名用户有这些。我怎样才能做到这一点?

【问题讨论】:

  • 您能否详细说明一下为什么您需要这样?我首先想到的是用这些属性和方法定义一个接口,并将你的对象转换为它。
  • 因为在一个类里面定义了一个匿名的。这个匿名类使用外部类的成员来做很多事情。现在外部类需要一个功能来知道匿名类中的函数是否被调用。可以有很多解决方案,我通过在外部类中定义属性并将它们设置为匿名类中的值来解决这个问题。但是@rzwitserloot 对我来说看起来不错。

标签: java anonymous-types


【解决方案1】:

它们可以很好地访问:

new ExistingExtendable() {
    public void foo() {}
}.foo();

效果很好。

但是如果你写:

ExistingExtendable x = new ExistingExtendable() {
    public void foo() {}
};
x.foo();

那行不通。出于同样的原因,这不起作用:

Object o = new String();
o.toLowerCase(); // nope

问题是你的匿名类没有名字,因此你不能表示它的类型。我们可以通过将Object o 替换为String o 来修复字符串示例,但没有String 等效项。

不过,这就是匿名内部类的意义所在。

如果您希望这些是可表示的,那么您不需要匿名内部类。问:“我想要一个匿名的内部类,但我希望我在其中声明的新成员可以访问”就像问:“我想要一个圆,但是……有角”。

你可以让方法成为本地内部类,现在你有了名字:

public void example(String x) {
    class IAmAMethodLocalClass extends ExistingExtendableJavaClass {
        String someProperty; // making them public is quite useless.

        String foo() {
            System.out.println(x); // you can access x here.
        }
    }

    IAmAMethodLocalClass hello = new IAmAMethodLocalClass();
    hello.someProperty = "It works!";
}

匿名内部类与此方法本地类的东西相同,只是它避免命名类型。在这种情况下,您需要该名称,因此,您不能使用匿名内部类构造。

【讨论】:

  • 哇!它为我完成了这项工作。为什么我没有想到这一点。
猜你喜欢
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 2019-03-31
  • 2017-10-26
相关资源
最近更新 更多