gpt4 book ai didi

java - 如何设计扩展

转载 作者:IT老高 更新时间:2023-10-28 21:01:36 30 4
gpt4 key购买 nike

有一个Checkstyle规则 DesignForExtension .它说:如果您有一个非抽象、非最终或空的公共(public)/ protected 方法,则它不是“为扩展而设计的”。阅读 description for this rule on the Checkstyle page理由。

想象一下这种情况。我有一个抽象类,它定义了一些字段和这些字段的验证方法:

public abstract class Plant {
private String roots;
private String trunk;

// setters go here

protected void validate() {
if (roots == null) throw new IllegalArgumentException("No roots!");
if (trunk == null) throw new IllegalArgumentException("No trunk!");
}

public abstract void grow();
}

我还有一个 Plant 的子类:

public class Tree extends Plant {
private List<String> leaves;

// setters go here

@Overrides
protected void validate() {
super.validate();
if (leaves == null) throw new IllegalArgumentException("No leaves!");
}

public void grow() {
validate();
// grow process
}
}

根据 Checkstyle 规则,Plant.validate() 方法不是为扩展而设计的。但是在这种情况下我该如何设计扩展呢?

最佳答案

该规则在提示,因为派生(扩展)类可能会完全替换您提供的功能而不告诉您。这是一个强烈的迹象,表明您尚未完全考虑如何扩展该类型。它希望你做的是这样的事情:

public abstract class Plant {
private String roots;
private String trunk;

// setters go here

private void validate() {
if (roots == null) throw new IllegalArgumentException("No roots!");
if (trunk == null) throw new IllegalArgumentException("No trunk!");
validateEx();
}

protected void validateEx() { }

public abstract void grow();
}

请注意,现在有人仍然可以提供自己的验证代码,但他们无法替换您预先编写的代码。根据您打算如何使用 validate 方法,您也可以将其设为 public final。

关于java - 如何设计扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/662598/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com