Is chaining method calls to constructors a good practice in Java?

时间:2016-05-13 15:32:04

标签: java class methods

I have always thought that I have to initialize a class, before I can call it's non-static method, however, I came across a solution which had a method like this in it:

public String someStringMethod(){
    return new MyClass().toString();
}

So I may be new in development, but is it a good practice? Is this a better way to call a method than the "classic" (see below) way?

public String classicStringMethod(){
    MyClass cl = new MyClass();
    return cl.toString();
}

Do they have any performance difference? Does the first way has a "special name"?

1 个答案:

答案 0 :(得分:2)

无显着差异

正如评论所解释的那样,两种方法在语义上都是相同的;两种方式都能达到完全相同的结果,而选择实际上只是一种风格差异。

第二种方法将新对象分配给引用变量。第一种方法跳过了引用变量的使用。但在这两种情况下,该类都被用作实例化对象的定义,然后在该对象上调用了toString方法。

从语义上讲,第一个(链接/流畅)语法通常会通知您创建的对象将仅用于单个操作链,之后将被丢弃。由于没有显式引用导出,它还表示对象的生命范围仅限于该语句。第二个(显式)提示对象是/将/将用于其他操作,无论是另一个方法调用,为其设置字段,返回它,甚至只是调试。不过,the general notion of using (or not) temporary helper variables is just a stylistic one

请记住,变量不是对象。例如,行Dog hershey = new Dog( "Australian Shepard" , "red", "Hershey" );使用两个内存块。在一个块中是新对象,保存品种的颜色和名称的状态数据。在另一个单独的块中,引用变量hershey包含指向Dog对象的内存块的内存位置的指针。引用变量让我们稍后引用该对象。

Java语法使得从引用变量到对象的跳转非常无缝,我们通常将hershey 视为 Dog对象“Hershey”,但实际上它们是分开的和不同的。

至于表现,任何差异都是微不足道的。实际上,编译器或JVM可能会将第二种方法的两条线​​折叠成第一种方法的单线。我不确定,我也不在乎。你也不应该。我们的工作是编写清晰可读的代码。编译器和JVM的工作是可靠,高效和快速地运行该代码。多次尝试微优化已被证明是徒劳的(甚至适得其反),因为JVM实现是非常复杂的软件工程,经过高度调整以进行此类优化。您可以通过编写简单的直接代码而无需“聪明”来最好地协助编译器和JVM。

请注意,第二种方法可以使调试更容易,因为您的调试器可以通过引用变量访问对象来检查实例化对象,并且因为您可以显式地在该特定构造函数调用上设置行断点。