gpt4 book ai didi

Java:是否不鼓励 child 压倒 parent ?

转载 作者:行者123 更新时间:2023-12-01 16:45:17 26 4
gpt4 key购买 nike

我想知道,在设计一个供其他人使用的框架时,类有一些功能作为默认行为,并希望其客户在必要时覆盖它,这是否会让人皱眉。一个例子如下:

public class RecordProcessor<T extends Record> {
// ...
public void process() {
// process record logic
}
}

该库的使用者创建他们的具体类来处理他们自己的 T 类型记录。

现在我想添加一个名为 preProcess() 的函数,为消费者提供预处理其记录的能力。然后它看起来像这样:

public class RecordProcessor<T extends Record> {
// ...
public void process() {
preprocess();
// process record logic
}

public void preProcess() {
// By default no preprocessing
}
}

我知道我可以使 preProcess 成为一个抽象函数,但由于以下几个原因我不想这样做:

  1. 并非所有客户都需要预处理他们的记录

  2. 我们有一个自动部署推送代码的管道结构,因此将 RecordProcessor 设为抽象类会立即破坏我们客户的应用程序。

preProcess 在父类中不执行任何操作并让子类覆盖它是否被认为是不好的做法?如果没有,让客户知道他们现在有权预处理记录的最佳方式应该是什么?通过java文档?

最佳答案

一种方法是将公共(public)方法标记为 final方法(但这也可能会破坏现有应用程序)并允许覆盖 protected Hook 方法。例如:

public class RecordProcessor<T extends Record> {
// ...
public final void process() {
doPreProcess();
doProcess();
doPostProcess();
}

protected void doPreProcess() {
// By default no preprocessing
return;
}

protected void doProcess() {
// some default implementation
}

protected void doPostProcess() {
// By default no postprocessing
return;
}
}

拥有一些文档应该可以让其他开发人员自然地识别可选的扩展方法。

我不认为使用一个不执行任何操作的钩子(Hook)方法有什么问题。但是,它应该包含一个 return 语句,这样静态分析工具就不会提示。

更新:为了避免破坏现有应用程序,如果可能,请将现有方法标记为已弃用并引入新方法。例如:

public class RecordProcessor<T extends Record> {
// ...

public final void execute() {
doPreProcess();
doProcess();
doPostProcess();
}

@Deprecated - use execute() method instead.
public void process() {
doProcess();
}

protected void doPreProcess() {
// By default no preprocessing
return;
}

protected void doProcess() {
// some default implementation
}

protected void doPostProcess() {
// By default no postprocessing
return;
}
}

关于Java:是否不鼓励 child 压倒 parent ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52995151/

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