Java 内联优化是否正确?
Java inline optimization is this correct?
所以我刚刚看到这段代码在工作,作者告诉我这是为了内联优化。
Class Test{
...
void init(){
//sets variables, call functions, etc
}
...
}
然后他在 main 中这样调用它
Test t=new Test();
t.init();
而不是在默认构造函数中包含 init() 中的代码。他告诉我这是为了内联优化。
这个对吗?它如何更快?我在哪里可以读到这个?
它并不快。它似乎基于可以内联方法但不能内联构造函数的假设。不幸的是,这是胡说八道,所以它的全部意义都在 window.
即使这样更快,也几乎肯定不是一个好主意。不应以牺牲可读性为代价来优化代码,除非在极端情况下每个最后的 CPU 周期都至关重要,在这种情况下你不太可能使用 Java.
事实上,这比更难阅读更糟糕。下一次重构将不可避免地让 Test
构造函数调用 init()
方法,这样它就不必总是手动完成(并且手动完成是一种痛苦和潜在的错误来源如果忘记了);如果构造函数调用可以重写的方法,这是不好的做法,因为子类可能会无意中更改调用超类构造函数时在构造时发生的情况(有关更多详细信息,请参见 this question)。发生这种情况时,同一包中 Test
的子类将能够覆盖 init()
方法,然后当子类隐式或显式调用 super()
时,超类的构造函数将最终调用 overridden init()
。 (可以通过将 init()
声明为 private
来解决这个特殊问题。)
不要这样做。
我不认为你有什么可以优化的。话虽如此,我也不认为这在设计阶段是个好主意,因为 class 初始化是每个 class 必须自己完成的事情。将此类行为放在单独的方法中:
- 必须单独调用
- 反过来也可以被覆盖
是通常不推荐的东西。
所以我刚刚看到这段代码在工作,作者告诉我这是为了内联优化。
Class Test{
...
void init(){
//sets variables, call functions, etc
}
...
}
然后他在 main 中这样调用它
Test t=new Test();
t.init();
而不是在默认构造函数中包含 init() 中的代码。他告诉我这是为了内联优化。 这个对吗?它如何更快?我在哪里可以读到这个?
它并不快。它似乎基于可以内联方法但不能内联构造函数的假设。不幸的是,这是胡说八道,所以它的全部意义都在 window.
即使这样更快,也几乎肯定不是一个好主意。不应以牺牲可读性为代价来优化代码,除非在极端情况下每个最后的 CPU 周期都至关重要,在这种情况下你不太可能使用 Java.
事实上,这比更难阅读更糟糕。下一次重构将不可避免地让 Test
构造函数调用 init()
方法,这样它就不必总是手动完成(并且手动完成是一种痛苦和潜在的错误来源如果忘记了);如果构造函数调用可以重写的方法,这是不好的做法,因为子类可能会无意中更改调用超类构造函数时在构造时发生的情况(有关更多详细信息,请参见 this question)。发生这种情况时,同一包中 Test
的子类将能够覆盖 init()
方法,然后当子类隐式或显式调用 super()
时,超类的构造函数将最终调用 overridden init()
。 (可以通过将 init()
声明为 private
来解决这个特殊问题。)
不要这样做。
我不认为你有什么可以优化的。话虽如此,我也不认为这在设计阶段是个好主意,因为 class 初始化是每个 class 必须自己完成的事情。将此类行为放在单独的方法中:
- 必须单独调用
- 反过来也可以被覆盖
是通常不推荐的东西。