java - 更喜欢非成员非友元函数......在 Java 中?

标签 java c++ interface encapsulation convenience-methods

<分区>

免责声明:这个问题是针对那些认为 Scott Meyers 在 Effective C++ 的第 23 项中的建议是 良好的 OO 设计 的人——至少在 C++ 中是这样。

在不存在全局函数的 Java 中,乍一看这条原则似乎不适用,但在我看来确实如此。以 Scott Meyers 自己为例。

public class WebBrowser {
    public void clearCache() {}
    public void clearHistory() {}
    public void removeCookies() {}
}

通过创建一个包含 static 便捷方法的关联“命名空间”类,我通过最小化可以访问其内部结构的代码量增加了 WebBrowser 的封装。毕竟,Java 中的静态方法本质上是全局函数(假设类中的所有内容都是公共(public)的和静态的)。

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 事情。

最佳答案

WebBrowserStuff.clearBrowser(browser);

是按类定义的静态方法,不能直接访问传递的实例之外的实例。出于实用原因,这需要另一个 类。通常在 Java 的库本身中,只有当我们使用无法处理所有这些静态方法的专用类型时才会这样做( Array 对象与 Arrays 类中的实用程序对比,或 Collections ,其中我们正在使用不应采用静态方法的大量接口(interface)。

这些辅助类通常不是好的做法,在您的情况下,您可以并且应该放置clearBrowser作为 WebBrowser 的非静态方法.

现在,这已经完成了,虽然这不是很好的做法,但它在技术上是有效的,并且没有契约(Contract)义务否认您的这项权利。在这一点上,为了符合 Java 库的命名,我将辅助类称为 WebBrowsers。因为库通常采用有问题的类/接口(interface)并将其复数化以用于此命名目的。

关于java - 更喜欢非成员非友元函数......在 Java 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17677736/

相关文章:

c++ - 如何在 mex 代码中表示 MATLAB 的二维数组

c++ - 如何创建一个使用字符串格式的给定变量文本的宏(或其他工具)?

android - AIDL接口(interface)参数值中的"In/out/inout"?

java - 使用 spring-amqp ListenerContainer 关闭应用程序会挂起或需要很长时间

c++ - 使用 boost 预处理器对元组进行字符串化

java - 如何解决组合框的冲突?

java - 无法访问在 Java 接口(interface)中声明的常量/最终字符串数组值

java - 对于java,如何确保内部接口(interface)和外部接口(interface)具有相同的泛型?

java - Selenium : How to stop geckodriver process impacting PC memory, 没有调用 driver.quit()?

java - Java 8 闭包存储在哪里?