Java不良做法:新...().doSomething()?

时间:2019-04-17 10:47:49

标签: java constructor static-methods object-construction

我刚刚看到了一段代码,其中只有一个方法具有一些类。我举了一个例子:

public class TempDirCleanupProcess {
  public void cleanup(final File directory) {} 
}

然后,在代码的稍后部分中,该方法被称为以下方式:

new TempDirCleanupProcess().cleanup(tempDir);

现在我想知道这是否是一个不好的做法,因为我以前仅使用静态方法看到过这种“行为”。 有什么反对意见吗?

3 个答案:

答案 0 :(得分:4)

当然,可以使用静态方法将其重构为类。它将消除每次需要调用该方法时都创建实例的需要。在这种情况下,如果没有给出其他上下文,则静态方法将是更好的解决方案。

但是,不要忘记,一个类可以保留一个状态,并且一个方法可以更改该状态并返回对当前对象的引用。

public class Builder {
  // state

  public Builder buildPart(T part) { 
      // update the state
      return this;
  } 

}

它类似于构建器模式的一种变体,并且很有意义。

return new Builder();
return new Builder().buildPart(partA);
return new Builder().buildPart(partA).buildPart(partB);

我还可以想到一种极端较差的设计,其中this将从cleanup中泄漏出来,因此对new TempDirCleanupProcess()的引用不会在执行该行后丢失。

答案 1 :(得分:3)

它看起来像一个标准的静态方法,但是我们看不到所有细节

因此,也许在创建对象时,您还同时创建了cleanup方法中使用的实例成员,并且必须创建该对象才能使它们可用

答案 2 :(得分:1)

另一种方法是拥有这样的Directory类

Directory temp = new Directory('path/to/file');
temp.cleanup()

这还允许您继承其他需要所有这些实用程序功能的类中的Directory类。

也就是说,像您这样的类中的实用程序函数应该是静态的。