2015-03-08 4 views
5

я наткнулся на следующее:Использует пустой статический метод в классе, который имеет статический инициализатор, приемлемый/идиоматический?

class Foo { 

    static { 
    // setup for logging and configuration 
    } 

    public static void setup() { 
    // do nothing 
    } 

} 

Является ли это идиоматическое код Java? Есть ли конкретные причины, которых следует избегать?

Это было обнаружено в тестовом наборе.

Моя первоначальная проблема заключалась в том, что инициализация теоретически может произойти без вызова #setup().

+0

Ну, во-первых, он запрещает подклассам 'Foo' иметь собственную реализацию' setup() '... Было бы интересно посмотреть, что говорят гуру. – mazaneicha

+1

@mazaneicha Нет проблем с 'Bar extends Foo {public static void setup() {...}}' – laune

+0

@mazaneicha no it not –

ответ

-1

Является ли этот идиоматический код Java?

No.

Есть ли конкретные причины этого следует избегать?

Да: это сбивает с толку, о чем свидетельствуют комментарии к этому вопросу.

Моя первоначальная проблема заключалась в том, что теоретически может начаться инициализация без вызова #setup().

Я думаю беспокойство автора было то, что инициализация может не произойти без вызова setup(). Метод setup() гарантирует, что статический инициализатор выполнил свою «настройку для ведения журнала и настройки». Предположительно, есть побочные эффекты для этой конфигурации, которые автор стремится обеспечить, вызвав пустой метод.

0

Был ли код, который вы отправили, точно, что вы столкнулись? В JUnit обычно используется статический метод, аннотированный с помощью @BeforeClass для настройки тестового класса, и метод экземпляра, аннотированный с помощью @Before для конфигурирования каждого модульного теста.

(Ниже приведены примеры их использования: http://examples.javacodegeeks.com/core-java/junit/junit-before-and-beforeclass-example/)

В противном случае, это кажется странным ...

+0

См. [[]] (Http://stackoverflow.com/questions/28929588/is-using-an-empty-static-method-in-a-class-that-has-a-static-initializer-accepta/7117?noredirect = 1 # comment46115409_28929792), указывающий на назначение метода 'setup()', не является частью JUnit. – jaco0646

0

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

Смежные вопросы