设置值以从子类抽象私有字段

Setting value to abstract private field from subclass

我想知道从子类中为抽象私有字段设置值的最有效方法。因此,例如,有一个名为itemCost的字段,那么我想在子类中将其值初始化为200。

Java中没有这样的抽象私有字段。只有 classes 和方法可以是抽象的。但是要模拟一个抽象域,我相信至少有两个好的方法:

  • 方法 (1): 在superclass中定义一个未初始化的final field。并在子 class 中对其进行初始化。这更适合常量(原始)变量,并且在构造函数中初始化变量非常好。它当然也适用于复杂类型(class 具有可变内容的实例,而不是原始类型)。
  • Method (2): 为字段定义一个abstract setter,强制subclass implement/redefine 这个方法并做具体的初始化。这更适合于变化的字段内容,但不能保证该字段将被所有子 class 正确初始化。这变得依赖于实现。

方法(1)

abstract class MySuperClass {
    final int itemCost;
    
    protected MySuperClass(int _itemCost) {
        this.itemCost = _itemCost;
    }
}

class MySubClass extends MySuperClass {
    public MySubClass() {
        super(200);
    }
    
    public MySubClass(int itemCost) {
        super(itemCost);
    }
}

如果您不调用 super(itemCost),您将遇到编译器错误。所以这是非常强制的。

方法(2)

abstract class MySuperClass {
    int itemCost;
    
    protected MySuperClass() { }
    
    abstract void setItemCost();
    abstract void setItemCost(int _itemCost);
}

class MySubClass extends MySuperClass {
    public MySubClass() {
        setItemCost();
    }
    
    public MySubClass(int itemCost) { 
        setItemCost(itemCost);
    }

    @Override
    final void setItemCost() {
        this.itemCost = 200;
    }
    
    @Override
    final void setItemCost(int _itemCost) {
        this.itemCost = _itemCost;
    }        
}

如果您有兴趣在实例化后修改值,并且如果子 class 正确实现,那么这是一个很好的解决方案。但这是一个更冗长、更不直观且容易出错的解决方案。