java - 在最终实例变量声明中使用 'this' 可以吗?

标签 java android final

在 Java 中的 final 实例变量声明/初始化中使用 this 关键字可以吗?

像这样:

private final SomeClass foo = new SomeClass(this);

我尝试了一下,确实有效。由于它不是静态变量,我猜它应该引用一个特定的实例。但我不确定这是否可取,所以我想在这里问。

编辑: 主类是一个Android Activity类,SomeClass实例需要这个Activity作为Context。

最佳答案

这样做“在技术上是有效的”。事实上,this 指的是一个特定的实例 - 即包含 SomeClass 实例的实例。

但我一般建议这样做。传递给构造函数的 this 的确切行为和状态取决于微妙的细节。考虑以下示例:

class SomeClass
{
    public SomeClass(DangerousSelfReference dangerousSelfReference)
    {
        System.out.println("State: ");
        System.out.println("   a: "+dangerousSelfReference.getA());
        System.out.println("   b: "+dangerousSelfReference.getB());
        System.out.println("   c: "+dangerousSelfReference.getC());
        System.out.println("   d: "+dangerousSelfReference.getD());
        System.out.println(" ref: "+dangerousSelfReference.getRef());
    }
}

public class DangerousSelfReference
{
    public static void main(String[] args)
    {
        DangerousSelfReference d = new DangerousSelfReference();
    }

    private String a;
    private String b = "b";
    private final SomeClass ref = new SomeClass(this);
    private final String c = "c";
    private String d = "d";

    DangerousSelfReference()
    {
        a = "a";
    }

    String getA()
    {
        return a;
    }
    String getB()
    {
        return b;
    }
    String getC()
    {
        return c;
    }
    String getD()
    {
        return d;
    }
    SomeClass getRef()
    {
        return ref;
    }
}

我认为这可以成为一个简洁的求职面试问题,因为预测输出很困难。令人惊讶的是,它打印了

State: 
   a: null
   b: b
   c: c
   d: null
 ref: null

请注意,final 变量c 已初始化,但非final 变量d 初始化然而。与此相反,非最终变量 b(在 SomeClass 实例之前声明的)已经初始化。

这种微妙之处总是值得怀疑的,如果可能的话应该避免。

关于java - 在最终实例变量声明中使用 'this' 可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23264480/

相关文章:

java - 如何从 Android 应用程序检测 WiFi 网络中连接的所有设备

android - 从 SMS 数据库中仅检索特定的 SMS

java - 我们什么时候应该使用未初始化的静态最终变量?

java - final 方法在 Java 中的确切工作方式

java - 应用程序 :preDexDebug error sending mail using java mail 执行失败

java - 如何在静态类中初始化最终静态变量?

java - 合并多个 HashMap

构建元数据库时 java.lang.AbstractMethod 错误

Java 全屏模式不适用于 Ubuntu

java - sbt 程序集在提供的依赖项之间切换