将方法调用链接到构造函数在Java中是一种好的做法吗?

将方法调用链接到构造函数在Java中是一种好的做法吗?,java,class,methods,Java,Class,Methods,我一直认为我必须初始化一个类,然后才能调用它的非静态方法,然而,我遇到了一个解决方案,其中有这样一个方法: public String someStringMethod(){ return new MyClass().toString(); } 因此,我可能是新的发展,但这是一个良好的做法?这是一种比“经典”(见下文)方法更好的方法调用方法吗 他们的表现有什么不同吗?第一种方法有“特殊名称”吗?没有显著差异 正如评论所解释的,两种方法在语义上是相同的;两种方法都能达到完全相同的效果,而

我一直认为我必须初始化一个类,然后才能调用它的非静态方法,然而,我遇到了一个解决方案,其中有这样一个方法:

public String someStringMethod(){
    return new MyClass().toString();
}
因此,我可能是新的发展,但这是一个良好的做法?这是一种比“经典”(见下文)方法更好的方法调用方法吗

他们的表现有什么不同吗?第一种方法有“特殊名称”吗?

没有显著差异 正如评论所解释的,两种方法在语义上是相同的;两种方法都能达到完全相同的效果,而选择实际上只是风格上的差异

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

从语义上讲,first(chained/fluent)语法通常会通知您,所创建的对象将仅用于单个操作链,之后将被丢弃。由于没有导出显式引用,它还表示对象的生命范围仅限于该语句。第二个(显式)提示对象正在/曾经/将用于其他操作,无论是另一个方法调用、为其设置字段、返回它,甚至只是调试。仍然

请记住,变量不是对象。例如,行
Dog hershey=new Dog(“Australian Shepard”、“red”、“hershey”)使用两块内存。在一个区块中是新对象,它保存着品种、颜色和名称的状态数据。在另一个单独的块中是引用变量
hershey
,它持有一个指向Dog对象的内存块的内存位置的指针。引用变量允许我们稍后引用对象

Java语法使这个从引用变量到对象的跳跃如此无缝,以至于我们通常认为
hershey
Dog
对象“hershey”,但事实上它们是分开的

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


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

它们有性能差异吗?第一条路有“特殊名称”吗?不,它们是等价的。除了保存对局部变量的引用(或不保存),我知道它没有一个特殊的名称。这实际上只是风格上的差异。我喜欢第二种风格。在我身后的人或者在深夜试图调试时看着它的可怜的人觉得它更清晰一些。一般来说,编译器/优化器会将其解析为相同的字节码。谢谢您的回答,现在已经很清楚了。哎呀,我相信混沌的意思是键入“fluent”,在上面的注释中,您会看到“fluid”一词。您问题的标题与正文提出的问题略有不同。为了回答标题中提出的问题,为什么放弃对新实例的引用在Java中是有效的?简而言之,答案是:。创建一个对象,用它做一些事情(甚至什么都不做),然后再也不引用它,这是完全有效的。虚拟机会把它清理干净的。@vaxquis我同意你的看法。但实际上,调试需要成功。似乎每次跳过helper变量时,我都会后悔,因为需要在调试器中检查它,所以必须返回编辑源代码以添加额外的行。我说的是写我自己的糟糕代码。我已经习惯了这种重写,以便能够进行调试,因此我认为引用将被重用(正如您所说)的含义已经从我的脑海中消失了。对于调试良好的代码,尤其是针对更广泛的程序员群体(如公共开源),那么您的建议就是sage。感谢您提供详细的答案。我想我仍然处在一个新手时代,在那里我试图运用我在学校学到的一切,就像我所学到的一样。我想我会继续使用helper变量方法进行调试,正如您提到的那样。@vaxquis我们同意。“这是一个记录在案的很好的交换。”巴斯尔堡在这种情况下,我冒昧地对你的回答作了一点修改;我还引用了您提到的
muglio
,因为注释引用极易导致注释腐烂(例如用户重命名等),并提到了第二种解决方案如何允许轻松的c-tor行断点。当然,如果您不同意,可以随时恢复编辑。
public String classicStringMethod(){
    MyClass cl = new MyClass();
    return cl.toString();
}