实现一个公共(public)方法来调用另一个公共(public)方法(例如 API)是否是一种好的做法?我担心当 API 用户重写这些方法时会出现重复问题。我建议使用私有(private)方法(可以由两个原始公共(public)方法调用)来进行实际实现。
想象一个像列表这样的数据结构。如果我对每个项目都有一个 addAll(lotsoItems) 调用 add(simgleItem) ,那么当被用户覆盖时,这将导致问题。 他可能在重写的“add”和“addAll”中做了一些逻辑。然后这个逻辑就会被重复,因为他不知道我会调用“add”。
看起来 Java(至少是 8)按照我描述的方式实现了 ArrayList。 谢天谢地,与 Android 的 ArrayAdapter 相同。
我的问题是:在设计可扩展的 API 或类时,什么时候可以从另一个公共(public)方法调用一个公共(public)方法?
编辑:举一个清晰的例子:
假设我正在扩展 ArrayList,因为每次将某些内容添加到列表中时,我想对用户“吠叫”(System.out.println("Bark!");)。很容易,对吧?因此,我去重写 .add(Object o) 来执行 .bark(),然后调用 .super(o)。然后,我将 .addAll(Object...os) 重写为 .bark() ,次数与 os 数组的长度相同,然后调用 .super(os)。呃,哦,问题来了:ArrayList 的实现者只是在 .addAll 中调用了 .add,而 .bark 的调用次数是我预期的两倍!
这是我的结论
https://gist.github.com/NightlyNexus/1256e4e36428b44ebf57
tl;dr 我现在对 OO 设计并不满意。
最佳答案
Effective Java 中讨论了与您所描述的 ArrayList 完全相同的问题。
据我所知,解决方案不是扩展 ArrayList,原因正是您所指出的,而是将 ArrayList 作为您自己的类的成员。
这样您以后就可以随时将 ArrayList 替换为您想要的任何内容。
关于java - OO设计-公共(public)API方法实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25277275/