如何强制 class 声明最终变量?
How to force a class to declare a final variable?
目前,我创建了一个摘要 class,如下所示:
public abstract class MyClass {
public final static String TAG;
...
}
但是它给我一个没有初始化最终变量的错误。然后我尝试从构造函数初始化它,但它也不起作用(给出相同的错误加上另一个尝试将值设置为最终变量的错误),尽管许多 Whosebug 帖子说这确实有效......
public abstract class MyClass {
public final static String TAG;
public MyClass(String u){
this.TAG = u;
}
}
似乎只有在声明变量时才需要分配最终变量。这个对吗?我怎样才能做到这一点?
据我所知,final 变量可以在两个点初始化。
final String test = "test1";
或
final String test;
if(conditionOneTrue) {
test = "test2";
} else {
test = "test3";
}
如果测试变量已初始化,编译器将只允许您继续。所有路由都必须导致变量被初始化。
在你的例子中,变量是静态的。这意味着可以在初始化 class 本身之前访问测试变量。编译器可能会注意到这一点,并告诉您确保最终变量已正确初始化。如果您删除静态,它应该可以工作。
它不起作用,因为您同时使用了 static 和 final。这意味着此 class 的所有子 class 将具有相同的 TAG。也不是你想要的。
我假设你想将它用于记录器,你可以在摘要中做这样的事情 class 它会打印出 subclasses name
Log.d("-- onCreate " + this.getClass().getName());
你不能,因为 static
关键字。 static final
保证变量的值在应用程序的整个生命周期内不会改变。当您尝试在构造函数中初始化它时,您将其值绑定到特定实例,从而破坏了 constant 的概念。由于您希望每个子类都有不同的值,您可以更改代码,如:
public abstract class MyClass {
protected final String mTag;
public MyClass(String u){
mTag = u;
}
}
这种方式 mTag
只能从 MyClass
的子类访问。或者您也可以在每个子类中将其声明为 constant
,省略构造函数的初始化。例如
public final static String TAG = YourClassName.class.getSimpleName();
@Corbella said : I just want TAG variable to be different depending on the class that is implementing MyClass
你可以试试
public abstract class MyClass {
private final String TAG;
public MyClass(String u){
this.TAG = u;
}
public String getTag() {
return this.TAG;
}
}
您的 TAG 只会由构造函数设置,您只能通过 getter.
从外部访问它
目前,我创建了一个摘要 class,如下所示:
public abstract class MyClass {
public final static String TAG;
...
}
但是它给我一个没有初始化最终变量的错误。然后我尝试从构造函数初始化它,但它也不起作用(给出相同的错误加上另一个尝试将值设置为最终变量的错误),尽管许多 Whosebug 帖子说这确实有效......
public abstract class MyClass {
public final static String TAG;
public MyClass(String u){
this.TAG = u;
}
}
似乎只有在声明变量时才需要分配最终变量。这个对吗?我怎样才能做到这一点?
据我所知,final 变量可以在两个点初始化。
final String test = "test1";
或
final String test;
if(conditionOneTrue) {
test = "test2";
} else {
test = "test3";
}
如果测试变量已初始化,编译器将只允许您继续。所有路由都必须导致变量被初始化。
在你的例子中,变量是静态的。这意味着可以在初始化 class 本身之前访问测试变量。编译器可能会注意到这一点,并告诉您确保最终变量已正确初始化。如果您删除静态,它应该可以工作。
它不起作用,因为您同时使用了 static 和 final。这意味着此 class 的所有子 class 将具有相同的 TAG。也不是你想要的。
我假设你想将它用于记录器,你可以在摘要中做这样的事情 class 它会打印出 subclasses name
Log.d("-- onCreate " + this.getClass().getName());
你不能,因为 static
关键字。 static final
保证变量的值在应用程序的整个生命周期内不会改变。当您尝试在构造函数中初始化它时,您将其值绑定到特定实例,从而破坏了 constant 的概念。由于您希望每个子类都有不同的值,您可以更改代码,如:
public abstract class MyClass {
protected final String mTag;
public MyClass(String u){
mTag = u;
}
}
这种方式 mTag
只能从 MyClass
的子类访问。或者您也可以在每个子类中将其声明为 constant
,省略构造函数的初始化。例如
public final static String TAG = YourClassName.class.getSimpleName();
@Corbella said : I just want TAG variable to be different depending on the class that is implementing MyClass
你可以试试
public abstract class MyClass {
private final String TAG;
public MyClass(String u){
this.TAG = u;
}
public String getTag() {
return this.TAG;
}
}
您的 TAG 只会由构造函数设置,您只能通过 getter.
从外部访问它