【问题标题】:Prevent anonymous class from referencing outer members in Java防止匿名类在 Java 中引用外部成员
【发布时间】:2015-11-13 02:49:38
【问题描述】:

在 Java 中,有没有办法显式阻止匿名类引用外部类或方法的成员/局部变量?

【问题讨论】:

  • 不要让它成为一个匿名类?
  • 为什么这是你想要的东西?
  • 不要相信,因为你总是可以从内部类做到这一点:Class.this.member
  • 叹息,为什么这被否决/关闭?这是一个合法、客观、具体的编程问题,对其他人和 OP 都有潜力。

标签: java


【解决方案1】:

没有。您总是在其他类中定义匿名类,例如

class A {

    private String aMember;

    public void test() {
        B b = new B() {

            @Override
            public void b() {
                ...
            }
        };
    }
}

您始终可以使用OuterClassName.this.something 访问外部类:

@Override
public void b() {
    A.this.aMember = "Hello";
}

为什么要限制对外部类的访问?一旦我们知道了这一点,我们就可以更好地了解您想要实现的目标。

【讨论】:

  • 所以对于 Java 8,我想将像 Function 这样的 lambda 传递到某些地方,并且我希望 lambda 完全是输入到输出的函数,不能使用其他东西在 lambda 之外。
  • @Pinch:你为什么要那个?您的目标是执行“纯”功能吗?你是个失败者,因为我仍然可以new Random().nextInt()MySingletonClass.getSomethingElse()
  • @Pinch lambda 不是匿名类。没有对封闭实例的引用。它们只保留在正文中明确使用的引用。
  • @PaulBoddington:lambda 的行为是否没有引用外部类实例记录在案?
  • @Pinch 阅读:cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html 相关位是 7: Variable Capture,但整本书值得一读。
猜你喜欢
  • 1970-01-01
  • 2018-08-25
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多