Плохая практика на Java: new ... () .doSomething ()? - PullRequest
4 голосов
/ 17 апреля 2019

Я только что увидел фрагмент кода, в котором было несколько классов только с одним методом. Я выбрал примеры:

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

Затем в коде метод был назван следующим образом:

new TempDirCleanupProcess().cleanup(tempDir);

Теперь мне интересно, является ли это плохой практикой, потому что я видел такое «поведение» только с использованием статических методов. Есть ли какие-либо возражения по этому поводу?

Ответы [ 3 ]

4 голосов
/ 17 апреля 2019

Конечно, он может быть преобразован в класс статическим методом.Это избавит от необходимости создавать экземпляр каждый раз, когда нужно вызвать метод.В этом конкретном случае без дополнительного контекста статический метод был бы более хорошим решением.

Однако не забывайте, что класс может содержать состояние, и один метод может изменить это состояние и вернуть ссылку натекущий объект.

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() не будет потеряна после выполнения строки.

3 голосов
/ 17 апреля 2019

Это похоже на стандартный статический метод, но мы не видим все детали

Так что, возможно, когда вы создаете объект, вы также создаете элементы экземпляра, которые используются в методе cleanup иВы должны создать объект, чтобы сделать их доступными

1 голос
/ 17 апреля 2019

Другой подход заключается в том, чтобы иметь класс Справочника, подобный таковому

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

. Это также позволяет вам наследовать класс Справочника в каком-то другом классе, который требует всех этих служебных функций.

При этом полезная функция в таком классе, как ваш, должна быть статической.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...