3 августа 2011 г.

Всю свою жизнь я писал статические классы-утилиты таким образом:
public final class Helpers{
  private Helpers(){
  }
  public static String veryHelpfullMethod(){
  ....
  }
}

Недавно заметил у коллеги в коде такой вариант:
public final class Helpers{
  private Helpers(){
    throw new AssertionError("Not for instantiation!");
  }
}


Взял себе на вооружение. И правда, с нынешним reflection-ом закрытый конструктор уже не гарантирует, что класс невозможно будет создать. А вот так -- final-класс, с единственным конструктором и выбросом исключения -- я уже не могу придумать способа (кроме byte-code-modification, конечно -- но против лома нет приема).

5 комментариев:

  1. Блок -- это который Александр? "По вечерам над ресторанами..."? :)

    Давненько я не читал книжек по джаве -- все статьями перебиваюсь, да

    ОтветитьУдалить
  2. Свежее веяние использовать Enum для синглтонов и утилитарных классов.

    ОтветитьУдалить
  3. Веяло, да -- но у меня как-то не прижилось. Есть у меня пунктик -- инструменты должны использоваться по назначению, и лишь в крайних случаях -- иначе. Убедить себя, что синглетон это частный случай перечислимого типа я еще могу. Но вот с классом утилит у меня самовнушение уже не проходит

    ОтветитьУдалить
  4. А зачем вообще запрещать создавать такие объекты, если состояния нет и все методы статические?

    ОтветитьУдалить
  5. Именно потому, что смысла в этом никакого нет, а значит попытка его создания это почти наверняка какая-то ошибка. А ошибки должны проявляться как можно раньше

    ОтветитьУдалить