java - OO设计-公共(public)API方法实现

标签 java android public

实现一个公共(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/

相关文章:

javascript - 为什么 "function sayHi.alternate () {}"不起作用?

java - 为网站添加额外的安全性

java - PageloadTimeout() 在带有 selenium 3.4 的 IE11 中不起作用

java - java语言如何将字符串解析成hashmap

android - 我们可以通过 GOOGLE APIs 模拟器测试应用内购买 android 应用程序吗

Android 应用程序在签名后不会通过按后退按钮最小化

java - 使用类名创建一个类

java - Java中 map Map的通用函数

android - 应用程序与我用来开发它的设备不兼容?

ios - swift:声明公共(public)变量