【发布时间】: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