免责声明:这个问题是针对那些认为Scott Meyers在有效C ++第23项中的建议是良好的OO设计的人 - 至少在C ++中是这样。
在Java中,全局函数不存在,起初可能看起来这个原则不适用,但在我看来它确实如此。以斯科特迈耶斯为例。
public class WebBrowser {
public void clearCache() {}
public void clearHistory() {}
public void removeCookies() {}
}
通过创建包含 static 便捷方法的关联“命名空间”类,我通过最小化可以访问其内部的代码量来增加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事物。
答案 0 :(得分:1)
WebBrowserStuff.clearBrowser(browser);
是一个静态方法,它是按类定义的,并且不能直接访问超出传递的实例的实例。出于实用原因,这需要另一个类。通常在Java的库本身中,只有当我们使用不能处理所有这些静态方法的专用类型时才会这样做(Array
对象与Arrays
类中的实用程序形成对比,或{ {1}},我们正在处理一系列不应采用静态方法的接口。
这些帮助程序类通常不是一种好的做法,在您的情况下,您可以并且应该将Collections
作为clearBrowser
的非静态方法。< / p>
现在,这已经完成,虽然这不是很好的做法,但它在技术上是有效的,并且没有合同义务否认你这一点。在这方面,为了满足Java库的命名,我将调用辅助类WebBrowser
,因为库通常采用有问题的类/接口并将其复数以用于此命名目的。
答案 1 :(得分:0)
可以接受,是的。首选,没有。原因如下:静态方法本质上是从实例化的开销中排除的 - 所以在WebBrowser类上为一些支持方法创建一个新类是非常愚蠢的。如果有的话,将静态方法添加到WebBrowser类。这样可以避免你所说的冗长,并将各种事物保持在一起。但是,我也同意Colin的看法,如果你把它建成一种类型的库或者以后要扩展的东西 - 那么不要在开始时过度隐藏它。
答案 2 :(得分:0)
不,这在Java中并不常见,而且不是这样做的。 您创建的WebBrowserStuff在Java中看起来像是Singleton Pattern的错误实现。 您的实现的一个问题是您可以创建WebBrowserStuff的多个实例。看起来你只需要一个,所以你应该使用Singleton。
想想你是否想在浏览器中使用这些方法。这似乎是在你的情况下进行的正确方法。它们应该是浏览器的一部分。
但是,如果你想做一个帮助类,请确保使它成为Singleton:添加一个私有构造函数,这样除了类之外的任何人都不能创建实例并添加getInstance()方法来获取实例。