在 Java 中的抽象 class 中实现辅助函数的最佳方法是什么?

What is the best way to implement helper functions inside an abstract class in Java?

假设我们有一个抽象 class(我们就称它为 X),它被许多 class 继承(我们现在称它们为 A 和 B)。从 X 继承的每个 class 都做类似但略有不同的事情,因此虽然每个 public 方法的实现可能略有不同,但它们都可以使用相同的辅助函数来避免重复代码。但是,任何不是 X.class 的子 class 的 class 访问这些辅助函数中的任何一个都是没有意义的。

此外,如果有一些辅助函数只能在扩展 X 的 class 内部使用,但需要在每个 class 中有稍微不同的实现怎么办? ?

这是一个例子:

public abstract class X {
    public abstract void doStuff();

    int helperFunction(int a, int b) {
        return a + b;
    }
    
    abstract void secondHelperFunction(int x);
}

public class A extends X {
    @Override
    public void doStuff() {
        //do some stuff
        helperFunction(a, b);
        //so some other stuff
    }
    
    @Override
    void secondHelperFunction(int x) {
         //implementation A
    }
}

public class B extends X {
    @Override
    public void doStuff() {
        //do some different stuff
        helperFunction(b, a);
        //do other stuff
    }

    @Override
    void secondHelperFunction(int x) {
        //implementation B
    }
}

(这个例子显然很简单,我只是想表达我的观点)

我的问题是,执行此操作的最佳方法是什么?例如,辅助函数应该使用什么访问修饰符?显然 private 不是一个选项,因为那时 subclasses 将无法使用它。 Default 和 protected 听起来是更好的选择,但它们仍然允许非 subclasses 使用这些函数,只要它们与 X 在同一个包中。那么这个问题的最佳解决方案是附上X 和所有从它继承的 classes 在它们自己的包中,与程序的其余部分分开?或者应该研究另一种抽象形式,例如接口? (虽然我想不出一种方法来特别使用接口来处理这个问题)

您可以考虑几个选项:

  1. 使用protected。你是对的,这不会阻止同一包中的其他 classes 调用该方法。但这真的是个问题吗?包的思想是将相关的 classes 聚集在一起,并控制调用它们的接口。访问修饰符是一种相对粗略的控制机制,主要用于帮助人们在编码时避免错误。

  2. 将辅助函数放在单独的 class 中,并使用组合而不是继承。您仍然可以覆盖方法以提供不同的行为。缺点是您需要传递所需的任何值。但这不一定是坏事,因为它使依赖关系变得清晰。