Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java内联优化是否正确?_Java_Oop_Optimization - Fatal编程技术网

Java内联优化是否正确?

Java内联优化是否正确?,java,oop,optimization,Java,Oop,Optimization,所以我在工作中看到了这段代码,作者告诉我这是用于内联优化的 Class Test{ ... void init(){ //sets variables, call functions, etc } ... } 然后他这样称呼它 Test t=new Test(); t.init(); 而不是使用包含init()代码的默认构造函数。他告诉我这是用于内联优化的。 这是正确的吗?怎么会更快?我在哪里能读到这方面的资料?这并不快。它似乎是基于这样一个假设:方法可以内联,而构造函数不能。不幸的

所以我在工作中看到了这段代码,作者告诉我这是用于内联优化的

Class Test{
...
void init(){
   //sets variables, call functions, etc
} 
...
}
然后他这样称呼它

Test t=new Test();
t.init();
而不是使用包含init()代码的默认构造函数。他告诉我这是用于内联优化的。
这是正确的吗?怎么会更快?我在哪里能读到这方面的资料?

这并不快。它似乎是基于这样一个假设:方法可以内联,而构造函数不能。不幸的是,这是胡说八道,所以它的全部意义都消失了

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

事实上,这比阅读困难更糟糕。下一次重构将不可避免地由
Test
构造函数调用
init()
方法,这样就不必总是手动进行重构(如果忘记了,手动进行重构是一种痛苦,也是潜在的bug来源);如果一个构造函数调用一个可以被重写的方法,这是一种不好的做法,因为当调用超类构造函数时,子类可能会无意中更改在构造时发生的情况(有关更多详细信息,请参阅)。发生这种情况时,同一个包中的
Test
的子类将能够重写
init()
方法,然后当子类隐式或显式调用
super()
时,超类的构造函数将最终调用重写的
init()
。(可以通过将
init()
声明为
private
来解决此特定问题)


不要这样做。

我认为您没有任何需要优化的地方。话虽如此,我认为在设计阶段这也不是一个好主意,因为类初始化是每个类必须自己完成的事情。将此类行为放在一个单独的方法中,该方法:

  • 必须单独打电话
  • 反过来也可以被覆盖

  • 是一些通常不被推荐的东西。

    没有任何东西可以优化代码中的任何内容。这应该是如何工作的?完全是胡说八道——作者是一个傻瓜,在构造函数和初始值设定项方面有一些微妙之处。(即使这个Q是关于在默认构造函数之后调用“helper”或worker方法,它也有点相关。)移动一个命名构造函数可能使用伪bean init或setter方法所做的所有工作是。。。不可取。init()的结果不会以与构造函数相同的严格要求发布,另一方面,所有空值都会严格发布。因此,它无疑有助于提高性能,它肯定与内联无关。如果有两个构造函数呢?如果两者都调用init方法,那么阅读起来会更容易,除非
    init
    方法正在做任何多线程的事情(例如将
    this
    注册为其他线程的侦听器,启动一个了解
    this
    的新线程等),在这种情况下,您必须保持
    init()
    separate for thread safety.@JClassic一个很好的处理方法是创建一个“规范”构造函数(可能是私有的,如果需要的话),并让其他构造函数通过
    this(someArg,anotherArg,可能是someArg+42)调用它。