Java坏习惯:新的。。。doSomething()?

Java坏习惯:新的。。。doSomething()?,java,constructor,static-methods,object-construction,Java,Constructor,Static Methods,Object Construction,我刚刚看到一段代码,其中有些类只有一个方法。我举了一个例子: public class TempDirCleanupProcess { public void cleanup(final File directory) {} } 随后,在代码中,该方法被以下方式调用: new TempDirCleanupProcess().cleanup(tempDir); 现在我想知道这是否是一种糟糕的做法,因为我以前只在静态方法中见过这种“行为”。 有什么异议吗 另一种方法是使用这样的目录类 Di

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

public class TempDirCleanupProcess {
  public void cleanup(final File directory) {} 
}
随后,在代码中,该方法被以下方式调用:

new TempDirCleanupProcess().cleanup(tempDir);
现在我想知道这是否是一种糟糕的做法,因为我以前只在静态方法中见过这种“行为”。
有什么异议吗

另一种方法是使用这样的目录类

Directory temp = new Directory('path/to/file');
temp.cleanup()
这还允许您在其他需要所有这些实用程序函数的类中继承目录类


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

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


因此,当您创建对象时,您可能也在创建在方法
清理
中使用的实例成员,并且您必须创建对象以使其可用

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

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

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);

我还可以想到一个非常糟糕的设计,
这个
会从
清理
中泄漏出来,因此在执行该行后,对该
新的TempDirCleanupProcess()
的引用不会丢失。

使用非静态方法,TempDirCleanupProcess的每次调用都会重新构造。如果经常发生,或者需要耗费大量资源,你应该考虑注入清理服务。静态方法是类方法,所以它们没有这个问题。可能重复的区别是,静态方法不能被重写,而非静态方法可以被重写。@mcempire但是如果您正在编写
新的TempDirCleanupProcess()
,您得到的是确切的类方法,而不是重写。有人可能会说它太宽了,或者不够清楚,但绝对不是基于意见。我投票决定重新打开它。它不能是静态的,因为它会引入硬耦合和隐藏耦合,并且会使测试成为一场噩梦。@SvetlinZarev你可以使用
PowerMockito.mockStatic
。当然可以,但是如果你不得不作弊,那么你的设计就是狗屎。我是说使用静态方法是一种糟糕的做法。最简单的现实情况是向
System.getProperty
等引入一个隐藏的依赖项——想象一个依赖于系统属性的测试,它失败了,因为其他测试设置了一些属性
您总是可以抽象对方法的调用
->当然您可以使用接口来抽象它,但是它不再是静态方法了,是吗?然后您有一个多态调用,而不是对静态方法的调用。你依赖于一个抽象,而不是一个具体的类。@DodgyCodeException这家伙有一个关于OOP的非常好的博客(尽管有时非常激进):他有关于OOP、静态方法和getter/setter Antipatens的非常好的文章。