【问题标题】:Which is the best way to do the following task in java在java中执行以下任务的最佳方法是什么
【发布时间】:2015-12-06 08:36:24
【问题描述】:

我的应用程序中有 20 多种常用方法。我想将这 20 个方法移到一个通用类中。

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

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堆中。

请说明哪一个是最好的方法。

【问题讨论】:

  • 你到底想达到什么目的?任何事物在每个领域都有自己的优缺点。更好,您可以将其设为 final Util 类并制作方法 static
  • 这些方法有什么关联吗?为什么这会比构造函数更好? (或单例,如果您希望它们都在同一个实例上)
  • 我不确定 static 方法,但从可测试性的角度来看,单身人士不赞成
  • 如果您不必在这些方法之间共享状态,您应该可以使用静态方法。
  • @subodh joshi:你到底想达到什么目标? >>> 应用程序性能和内存管理。那我为什么要问。

标签: java static heap-memory


【解决方案1】:

“常用功能”不太准确。这真的取决于你想做什么,例如,当我制作一些字符串实用程序时,我制作了 StringUtils 类,它有我需要的东西。是否将其设为静态取决于要处理的数据,如果一个信息可能在一次呼叫中多次使用,那么回答很简单 - 使用实例。

【讨论】:

    【解决方案2】:

    您应该考虑设计方面的“最佳”方式。

    如果这些方法用于一般用途,最好将它们设为static,因为您将没有任何状态要存储,并且您将以这种方式节省内存

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

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

    public final class Common {
    
        private Common() { }
    
        public static int method1() { }
        public static int method2() { }
        // ...
    
    }
    

    【讨论】:

      【解决方案3】:

      这取决于方法的作用。

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

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

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

        • 从内存管理和性能方面来看,哪种方法是正确的?
        • 从内存管理的角度来看,本质上没有区别。唯一的区别是为堆上的单个对象分配了 16 个字节。
        • 我是java新手,所以请接受我冷酷的问题,并给我您宝贵的答案。实际上,据我所知,我可以理解 jvm 为 PermGen 空间中的每个静态变量和方法分配内存空间。所以如果我们使用静态创建方法,jvm会在PermGen空间中创建20个内存空间。但是如果我们使用单例,在 permgen 中只会创建一个内存空间。这是我的疑问。我是对还是错?
        • @Anbazhagan 优化 10-20 字节和良好的代码设计的一般问题,包......是不好的
        • 请记住,类方法的存储完全独立于该类的实例。一个方法只存储一次,不管你有多少实例。这就是为什么方法是否是静态的无关紧要。 变量是另一回事,因为它们是数据。静态变量的存储不同于实例变量的存储。但这与您的设计困境无关。
        【解决方案5】:

        如果这种方法的意义是“执行纯函数”,如数学 sin(x)、cos(x) 等静态方法是最好的。

        它们属于一个域? (主题范围)或不同? (然后创建更多具有正确名称的“实用程序类”)

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

        问题的形状“我有 20 种方法在应用中”和名称 Common 暗示以前(较旧的)设计问题,我说“程序性思维”,OOP 的愿景不佳。

        没有代码很难说。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-13
          • 1970-01-01
          • 2010-09-19
          • 2017-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多