防止匿名类在 Java 中引用外部成员

Posted

技术标签:

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

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

【问题讨论】:

不要让它成为一个匿名类? 为什么这是你想要的东西? 不要相信,因为你总是可以从内部类做到这一点:Class.this.member ***.com/questions/758570/… 叹息,为什么这被否决/关闭?这是一个合法、客观、具体的编程问题,对其他人和 OP 都有潜力。 【参考方案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,但整本书值得一读。

以上是关于防止匿名类在 Java 中引用外部成员的主要内容,如果未能解决你的问题,请参考以下文章

java 如何调用局部内部类和匿名类

Java中内部类详解—匿名内部类

匿名内部类

java 匿名内部类

java学习之内部类匿名内部类

Java内部类持有外部类的引用详细分析与解决方案