所以我有这个抽象类
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:)
答案 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;
}
}
现在变量只在被调用时初始化一次。还有一些问题。有人可以使用反射来改变价值。此外,当序列化对象时,有人可能会更改该值。如果您有多个线程访问它,那么您应该同步该方法。但是,如果这些不是问题,那么此解决方案可能适合您。