【问题标题】:At what point should large functions be made static? [closed]什么时候应该将大型函数设为静态? [关闭]
【发布时间】:2014-02-23 03:03:44
【问题描述】:

当一个函数变得相当大时,我通常将其更改为静态。例如,如果 toString() 的类变得非常大,我通常会将其更改为

public String toString()  {
   return  ClassName.toString(this);
}

private static final String toString(ClassName c_n)  {
    //.........
}

如果函数不是太大,这样做是不是大材小用?


编辑

我在这里被击落了很多次。 :)

我了解静态修饰符一般应该如何使用(对于单例,对于与特定实例无关的东西,对于实用程序函数)。我是从 优化 的角度提出这个问题:为了避免大型函数的字节码在内存中重复,对于每个类的实例。我对它的工作原理显然是错误的。

【问题讨论】:

  • "When a function gets even moderately large, I generally change it to become static." -- 这毫无意义。正确的行为是,“当一个函数变得相当大时,我考虑重构它”。期间。
  • 我很好奇:您为什么认为这可能是有利的?将对象的显式引用传递给方法不会比非静态方法调用中固有的隐式版本保存任何内容;您所做的只是添加了另一层调用/返回并打破了任何依赖“this”的习语。
  • "I'm only asking this from an optimization point of view:..." -- 不,没有意义。方法的大小与代码的效率无关。把这个概念从你的脑海中抹去,然后继续前进。很抱歉直言不讳,但您很困惑。
  • 你分析过你的代码吗?您是否知道由于这种方法而导致瓶颈的事实?如果不是,请不要做任何假设,当然也不要根据此标准将 OOP 婴儿与洗澡水一起扔掉。
  • 我认为这是内存使用问题,而不是处理瓶颈:每个实例都复制了该函数的字节码。我认为将大型方法设为静态——仅在幕后,从未在 API 中看到或被我的代码的用户使用!——将避免这种重复。虽然我还不明白,但根据对这个问题的反应和否决票,我很清楚我的错误的深度

标签: java performance optimization


【解决方案1】:

根据函数的长度将函数设为静态是完全错误的。静态变量/方法属于类,不属于实例。

因此,如果实例之间有共同的功能,而不依赖于任何实例,那么它们可以是静态的。

在这里,您已将toString() 设为静态。但是,这个方法应该描述一个实例。将其设为静态会产生容易出错的结果。

调用这个方法有意义吗,即使还没有构造对象?” 如果是,它肯定是静态的。否则,那应该是实例方法 em>

【讨论】:

    【解决方案2】:

    你应该创建一个方法static如果它不依赖于声明它的类的实例。它与函数的长度无关

    【讨论】:

      【解决方案3】:

      代码(方法)不会在每个实例中复制,它不需要,因为它对于所有实例都是相同的并且不会被修改。

      仅复制实例数据(属性)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        • 2012-12-24
        • 2017-09-11
        • 1970-01-01
        • 2020-10-20
        相关资源
        最近更新 更多