Pull to refresh

Comments 20

Позвольте спросить, а на кого ориентирована эта статья?
Люди почему-то перед тем, как что-то написать, не думают: а надо ли?
теперь тут минусуют за то, что людям непонятно для чего эта статья?
Вы не поверите, но, если мне было бы не интересно, я бы и не спрашивал, серьезно.
Статью прочитал, но согласен с автором предыдущего комментария
"В свое время...", т.е было давно.
Делать класс абстрактным с private конструктором — малость странно — как по мне так более удачная практика, так это делать подобный класс final

см. java.util.Objects или великий и могучий sun.misc.Unsafe
Поддерживаю. +1

История хоть и вымышленная, но родилась не на пустом месте. Лет nth назад я повстречал человека, который утверждал, что final+private constructor не тоже самое, что abstract+private constructor. И его основной аргумент был в том, что через рефлекш, так просто создать объект класса с модификатором abstract не получится, в отличии от final, хотя при этом признавал не эстетичность конструкции. Но вот сколько лет я уже мучаюсь вопросом: 'А зачем?'. Может есть у кого хоть какие-то гипотезы?

Создание через рефлексию фиксится конструкцией throw в конструкторе.


А организовать такое можно и случайно, настраивая какой-нибудь IoC-контейнер.

Создание через рефлексию фиксится конструкцией throw в конструкторе.

Я так понимаю, у парней, которые сражаются за свой стиль abstract VS final есть 2 ключевых позиции: краткость и защищенность от.... Во вторую позицию Ваше предложение отлично вписывается, но вот в первую.
да ну фигня какая — если очень уж хочется — то можно и отнаследоваться от final класса, и сделать abstract не abstract — но вопрос — таки зачем?

мне как-то ближе традиционные практики как в том же Objects — и final, и private конструктор, и исключение в нём.
мне как-то ближе традиционные практики как в том же Objects — и final, и private конструктор, и исключение в нём.


Простите за рекламу, но посмотрите мой комент ниже ) Он гораздо компактнее и джава гарантирует, что скажет рефлекшену «Давай, досвиданья».

http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.9

An enum type has no instances other than those defined by its enum constants. It is a compile-time error to attempt to explicitly instantiate an enum type (§15.9.1).

In addition to the compile-time error, three further mechanisms ensure that no instances of an enum type exist beyond those defined by its enum constants:

The final clone method in Enum ensures that enum constants can never be cloned.

Reflective instantiation of enum types is prohibited.

Special treatment by the serialization mechanism ensures that duplicate instances are never created as a result of deserialization.


конечно же знаю этот приём, и читал ваш комментарий — но мне он не по нраву, не знаю почему, но не по нраву — наверно всё же потому, что привык utility-методы держать в классе, а не в enum-е, хотя это конечно же тоже класс.

вопрос привычки.

Нужна краткость — переходите на C#. Нам давным-давно статические классы завезли! (static class в C# = abstract final class в Java)

public enum Utils {
    ;

    /**несколько методов, для экономии места не привожу*/
}


Потому что можем.
Sign up to leave a comment.

Articles