gpt4 book ai didi

java - 非静态方法与使用静态方法的 Utilty

转载 作者:行者123 更新时间:2023-11-29 07:32:55 25 4
gpt4 key购买 nike

我正在用 Java 创建一个执行数据移动任务(如复制、移动等)的应用程序

在更高层次上,我可以在对象层次上提供这些操作。

示例代码:

public class DataSource {

public boolean copy(DataSource dsDestination);

public boolean copy(DataSource dsDestination, Filter filter);

public boolean move(DataSource dsDestination);

public boolean exists();

// some other 10-15 methods

}

或者我可以提供一个带有静态方法的工具:

public class DataSourceUtil {


public static boolean copy(DataSource dsSource, DataSource dsDestination);

public static boolean copy(DataSource dsSource, DataSource dsDestination, Filter filter);

public static boolean move(DataSource dsSource, DataSource dsDestination);

public static boolean exists(DataSource dsSource);

// some other 10-15 methods

}

哪种方法在内存管理方面更好?

最佳答案

黄金法则是:static 是良好 OO 设计中的异常。您只有在有充分理由的情况下才使用它。

你看,static 导致类之间的直接耦合。它使测试更加困难。当然,静态方法本身可以很容易地测试,但是如果你想测试一个调用这些静态方法的方法(并且你需要影响静态方法正在做什么)会怎样?那么您可能会想转向 Powermock 以模拟这些静态调用。这并不是一个好主意。

如果你坚持分离功能,你最好使用接口(interface),比如:

public class DataSource {
... ctor, equals, ... methods
}

public interface DataSourceCopyAbility {
public void copy(DataSource source, DataSource destintion);

加上相应的实现类。

编辑:当然,方便可以成为使用静态方法的正当理由;例如,我一直在代码中使用 Objects.requireNonNull() 。 但是:那些是标准的 API 调用。当我在我的代码中使用它们时,我真的不介意它们运行。我知道永远不会想“模拟”这种静态方法调用!

最后:我假设您希望在操作通过时返回 true坏主意: boolean 值只能用于区分真假。它们不是返回代码!

如果像复制 DataSource 这样复杂的操作失败了——然后抛出一个异常!或者,如果您真的想要无一异常(exception),请定义您自己的特定 ReturnCode 类,让您深入了解失败的操作!

关于java - 非静态方法与使用静态方法的 Utilty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39586784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com