在 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/