java 中执行以下任务的最佳方法是什么

Which is the best way to do the following task in java

我的应用中常用的方法有20多个。我想将这 20 种方法移动到一个通用的 class.

我的疑问是,将所有方法定义为静态或普通方法,并创建一个全局对象来访问普通方法。

class Common {

public String method1() {........}
public String method2() {........}
public String method3() {........}
public String method4() {........}
public String method5() {........}
...

}

正在创建对象。

class CommonService {
    private static Common common;

    public static Common getCommon() {
    if(null == common) {
    common = new common();
    }
    return common;
    }
}

如果我们使用静态方式创建所有方法,则所有 20 个方法都存储在堆的 PermGen 部分。

但是如果按照上面的方法,只能创建一个对象并存储在java堆中。

请说明哪种方法最好。

"Common functions" 不太准确。这真的取决于你想做什么,例如,当我制作一些字符串实用程序时,我制作了 StringUtils class 并且它有我需要的东西。是否使其静态取决于要处理的数据,如果一个信息可能会多次用于调用那么答案很简单 - 使用实例。

你应该从设计的角度考虑一下"best"的方式。

如果这些方法用于一般用途,则最好将它们设为 static,因为您将没有任何状态可存储,而且您将 节省内存这样。

在决定是否要在实用程序 class 中使用 static 方法之前,您应该考虑其他事项。一方面,实用程序 class 将非常容易测试,而且非常容易访问。另一方面,很难在测试中模拟 static 方法。

如果我有一个实用程序class,我会这样写:

public final class Common {

    private Common() { }

    public static int method1() { }
    public static int method2() { }
    // ...

}

这取决于方法的作用。

如果这些方法只是辅助方法,不会改变状态,那么 static 可能更好,因为这样您就不必在每次要使用其中一种方法时都创建一个对象。你可以打电话给 Common.method()

但是,如果对象有状态,那么您应该评估使用对象的方法,并在需要使用这些方法时创建一个新对象。

希望对您有所帮助。

If we create all the methods using static means, all 20 methods are stored in PermGen section of the heap.

方法不是数据,而是代码。存储代码的位置不取决于方法是否接受隐式 this 参数。如果使用单例方式,方法代码仍然会占用存储空间,并且堆上还会有一个实例。

但是,以上所有内容都是无关紧要的,您关注的是设计中完全错误的方面。重要的是决定将如何影响使用这些方法的代码:

  • 静态方法很简单,是纯函数(不依赖于任何外部状态)的绝佳选择;
  • 单例允许多态性,因此使方法更容易模拟以进行测试。

如果此方法的意义是 "execute pure function",如数学 sin(x)、cos(x) 等静态方法是最好的。

它们属于一个域? (主题范围)还是不同? (然后用正确的名称创建更多 "utility classes")

如果有状态(就像很多人说的那样)也许最好是单例。

问题的形状 "i have 20 method in application" 和名称 Common 建议以前的(较旧的)设计问题,我说 "procedural thinking",OOP 的视力不佳。

没有代码很难说。