目前,我创建了一个这样的抽象类:
public abstract class MyClass {
public final static String TAG;
...
}
但它给了我一个错误,即没有初始化最终变量。然后我尝试从构造函数初始化它,但它也没有工作(给出相同的错误加上另一个尝试将值设置为最终变量),尽管许多stackoverflow帖子说真的有用......
public abstract class MyClass {
public final static String TAG;
public MyClass(String u){
this.TAG = u;
}
}
似乎只有在声明变量时才必须分配最终变量。它是否正确?我怎样才能做到这一点?
答案 0 :(得分:5)
你不能因为static
关键字。 static final
可以确保变量的值不会在应用程序的整个生命周期中发生变化。当您尝试在构造函数中初始化它时,您将其值绑定到特定实例,从而破坏了常量的概念。由于您希望每个子类具有不同的值,因此您可以更改代码,如:
public abstract class MyClass {
protected final String mTag;
public MyClass(String u){
mTag = u;
}
}
这种方式mTag
只能从MyClass
的子类访问。或者您也可以在每个子类中声明它为constant
,省略构造函数的初始化。 E.g
public final static String TAG = YourClassName.class.getSimpleName();
答案 1 :(得分:1)
@Corbella说:我只是希望TAG变量不同,具体取决于实现MyClass的类
你可以尝试
public abstract class MyClass {
private final String TAG;
public MyClass(String u){
this.TAG = u;
}
public String getTag() {
return this.TAG;
}
}
您的TAG只能由构造函数设置,您只需通过getter从外部访问它。
答案 2 :(得分:0)
最终变量可以在我知道的两个点初始化。
final String test = "test1";
或者
final String test;
if(conditionOneTrue) {
test = "test2";
} else {
test = "test3";
}
如果初始化测试变量,编译器将只允许您继续。所有路由必须导致变量被初始化。
在您的情况下,变量是静态的。这意味着可以在类本身初始化之前访问测试变量。编译器可能会注意到这一点,并告诉您确保最终变量已正确初始化。如果删除静态,它应该可以工作。
答案 3 :(得分:0)
它不起作用,因为你同时使用静态和最终。这意味着此类的所有子类都具有相同的TAG。不是你想要的东西。
我假设您想将此用于记录器,您可以在抽象类中执行类似的操作,它将打印出子类名称
Log.d("-- onCreate " + this.getClass().getName());