如何强制 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.

从外部访问它