我想知道是否可以使用抽象方法的结果初始化抽象基类中的 Final 字段,该方法将由派生类实现。 我知道派生构造函数将首先调用基构造函数,因此我保证抽象方法实现也将仅依赖于派生类的声明时定义的最终字段。 我尝试了以下代码,它似乎有效。
abstract class Base {
protected final String name = calName();
protected abstract String calName();
}
public final class Foo extends Base {
private final String id = "42";
@Override
protected String calName() {
return String.format("WithId%s", id);
}
public void display() {
System.out.printf("name: %s\n", name);
System.out.printf("id: %s\n", id);
}
public static void main(String[] args) {
var foo = new Foo();
foo.display();
}
}
那么这是java中的合法操作,还是一个非常糟糕的主意?
是的,该行为完全合法。但是我更喜欢通过构造函数初始化字段。有一种使用这种行为的设计器模式 - 模板模式https://refactoring.guru/design-patterns/template-method。因此,您可以在抽象级别上定义行为,并且实现将只处理未实现/抽象方法。