在抽象类中初始化最终变量(Java)

时间:2014-09-12 00:18:46

标签: java class variables abstract final

所以我有这个抽象类

 public abstract class A {

   protected final boolean b;

   protected A (boolean b){
    this.b = b;
   }

}

此类扩展了A

 public class C extends A{

   protected C() {
    super(false);
   }

}

我不想要" b"能够改变它的'初始化后的值 但是我不知道如何在没有编译器失败的情况下做到这一点。

欢迎任何建议。提前谢谢。

EDIT1:静态从b。

中删除

编辑2:确定已解决问题并修复见上文。 特别感谢J.Lucky:)

3 个答案:

答案 0 :(得分:3)

我建议您使用final关键字。

请尝试以下代码:

abstract class A {

    final protected boolean b;

    A(boolean b) {
        this.b = b;
    }

    //No setter method
    //public abstract void setB(boolean b);
    public abstract boolean getB();
}

class C extends A {

    C(boolean b) {
        super(b);
    }

    @Override
    public boolean getB() {
        return b;
    }
}

示例实现将是:

public static void main(String args[]) {
    C c = new C(true);
    System.out.println(c.getB());
}

由于b现在是final变量,您将被迫在构造函数中初始化它,您将无法再改变b。即使你为b提供了一个setter方法,编译器也会阻止你。

编辑2:

假设您创建了另一个名为“D”的类,这次您知道默认情况下要将其设置为false。你可以有类似的东西:

class D extends A {
    D() {
        super(false);
    }

    //You can also overload it so that you will have a choice
    D(boolean b) {
        super(b);
    }


    @Override
    public boolean getB() {
        return b;
    }

    public static void main(String[] args) {
        D defaultBVal = D();
        D customBVal = D(true);

        System.out.println(defaultBVal.getB()); //false
        System.out.println(customBVal.getB()); //true
    }
}

答案 1 :(得分:0)

解决方案:您应该将布尔值更改为布尔值,将其设置为私有,提供getter和受保护的setter。在setter中,您应该检查布尔值是否已初始化。如果是这样,你应该忽略重置,或抛出和异常

答案 2 :(得分:0)

这是怎么回事:

public abstract class A {

   private static Boolean b;

   //setB is declared here and, depending on the class that implements it, 
   //it initializes the value of the variable "b"

   protected abstract void setB();

}

public class C extends A{

   protected void setB() {
     if(b != null) b = true;
   }
}

现在变量只在被调用时初始化一次。还有一些问题。有人可以使用反射来改变价值。此外,当序列化对象时,有人可能会更改该值。如果您有多个线程访问它,那么您应该同步该方法。但是,如果这些不是问题,那么此解决方案可能适合您。