如何强制类声明最终变量?

时间:2015-04-24 08:19:08

标签: android abstract-class final

目前,我创建了一个这样的抽象类:

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;
    }
}

似乎只有在声明变量时才必须分配最终变量。它是否正确?我怎样才能做到这一点?

4 个答案:

答案 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());