免责声明:这个问题是针对那些认为 Scott Meyers 在 Effective C++ 第 23 条中的建议是好的 OO 设计的人——至少在 C++ 中是这样。
在不存在全局函数的 Java 中,乍一看这个原则似乎不适用,但在我看来它是适用的。以斯科特迈耶斯自己的例子为例。
public class WebBrowser {
public void clearCache() {}
public void clearHistory() {}
public void removeCookies() {}
}
通过创建一个包含静态便利方法的关联“命名空间”类,我WebBrowser
通过最小化可以访问其内部的代码量来增加封装。毕竟,Java 中的静态方法本质上是全局函数(假设类中的所有内容都是公共的和静态的)。
public class WebBrowserStuff {
private WebBrowserStuff() {} // prevent instantiation
public static void clearBrowser(WebBrowser browser) {
browser.clearCache();
browser.clearHistory();
browser.clearRemoveCookies();
}
}
我能看到的唯一缺点是 Java 中没有依赖于参数的查找,因此调用该方法会稍微冗长一些。
WebBrowserStuff.clearBrowser(browser);
我的问题是,考虑到在 C++ 中使用非成员函数是可取的(请参阅我的免责声明),除了增加冗长之外,还有什么理由不希望在 Java 中这样做?这个问题特别是关于 C++ 和 Java 在这种技术方面的区别。
我不想听听个人关于这是否是一个好的面向对象设计的意见,尽管我有兴趣听听 C++ 和 Java 之间是否存在任何可能导致普遍意见偏向于一种或另一种的文化差异。
[编辑]
不幸的是,我并没有真正得到我的问题的答案,我试图减少基于意见的编辑并没有阻止它被关闭,所以我无法选择一个可接受的答案。可以将其解释为实际上没有技术原因您不想这样做(假设这是 C++ 中的良好实践),并且对这种技术的任何反对纯粹是个人的或文化的 Java 事物。