2015-01-06 39 views
7

所以我刚刚看到这个代码在工作,作者告诉我这是内联优化。Java内联优化是否正确?

Class Test{ 
... 
void init(){ 
    //sets variables, call functions, etc 
} 
... 
} 

然后他称之为主这样

Test t=new Test(); 
t.init(); 

而是用从的init()在它的代码默认的构造函数。他告诉我这是内联优化。 这是正确的吗?它如何更快?我在哪里读到这个?

+4

问问作者。 –

+4

没有什么优化你的代码中的任何东西.. – Maroun

+0

这是如何工作的? – Natix

回答

14

这不是更快。它似乎是基于一种方法可以内联但构造函数不能的假设。不幸的是,这是无稽之谈,所以它的全部内容都离开了窗口。

即使这样更快,它几乎肯定是一个坏主意。代码不应该以可读性为代价进行优化,除非在每个最后一个CPU周期都很关键的极端情况下,在这种情况下,您不太可能使用Java。

事实上,这比只是难以阅读更糟糕。接下来的重构将不可避免地为Test构造函数调用init()方法,因此它不一定需要手动完成(并且如果它被忘记,手动执行操作是一个痛苦和一个潜在的错误来源);如果构造函数调用可以重写的方法是不好的做法,因为子类可能会无意中更改构造函数在调用超类构造函数时发生的情况(有关更多详细信息,请参阅this question)。发生这种情况时,同一包中的Test的子类将能够覆盖方法init(),然后当子类调用super()(隐式或显式地)时,超类的构造函数将最终调用替换为 10。 (这个问题可以通过声明init()private来解决。)

不要这样做。

+0

如果有2个构造函数呢?如果两者都被称为初始化方法 – JClassic

+0

_Unless_ init'方法执行任何多线程操作(例如将'this'注册为某个其他线程的侦听器,启动一个知道'this'的新线程等等, ),在这种情况下,为了线程安全,你必须保持'init()'独立。 – yshavit

+2

@JClassic一个很好的方法来处理这个问题,就是通过构造一个“规范”构造函数(可能是私有的,如果需要的话)并让其他构造函数通过'this(someArg,anotherArg,maybeSomeArg + 42)'调用它。 – yshavit

1

我不认为你有什么优化。话虽如此,但我认为在设计阶段这不是一个好主意,要么是因为类初始化是每个类必须自己做的事情。在一个单独的方法,将这种行为:

  1. 必须单独叫
  2. 能,反过来也覆盖

是一些东西,通常不建议使用。