Java: статический класс?

Вы могли записать немного служебного метода стиля соединения, который работает над java.util. Списки

public static String join(List<String> list, String delim) {

    StringBuilder sb = new StringBuilder();

    String loopDelim = "";

    for(String s : list) {

        sb.append(loopDelim);
        sb.append(s);            

        loopDelim = delim;
    }

    return sb.toString();
}

Тогда использование это как так:

    List<String> list = new ArrayList<String>();

    if( condition )        list.add("elementName");
    if( anotherCondition ) list.add("anotherElementName");

    join(list, ",");
128
задан Nick Heiner 4 December 2009 в 01:40
поделиться

7 ответов

Частный конструктор и статические методы в классе, помеченном как final.

160
ответ дан 24 November 2019 в 00:36
поделиться

Согласно великой книге «Эффективная Java» :

Правило 4: Обеспечьте неэкземплярность с помощью частного конструктора

- Попытка обеспечить неинстанциональность путем создания класса абстрактный не работает.

- Конструктор по умолчанию создается только в том случае, если класс не содержит явных конструкторов, поэтому класс можно сделать неинстанцируемым, включив частный конструктор:

// Noninstantiable utility class
public class UtilityClass
{
    // Suppress default constructor for noninstantiability
    private UtilityClass() {
        throw new AssertionError();
    }
}

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

В качестве побочного эффекта эта идиома также предотвращает создание подкласса класса. Все конструкторы должны вызывать конструктор суперкласса, явно или неявно, и у подкласса не будет доступного конструктора суперкласса для вызова.

93
ответ дан 24 November 2019 в 00:36
поделиться

Похоже, у вас есть служебный класс, аналогичный java.lang.Math .
Есть подход final class с частным конструктором и статическими методами.

Но остерегайтесь того, что это делает для тестируемости, я рекомендую прочитать эту статью
Статические методы - смерть тестируемости

21
ответ дан 24 November 2019 в 00:36
поделиться

Просто чтобы плыть против течения, статические члены и классы не участвуют в объектно-ориентированном взаимодействии и, следовательно, являются злом. Нет, не зло, но серьезно, я бы порекомендовал обычный класс с одноэлементным шаблоном для доступа. Таким образом, если вам нужно переопределить поведение в любом случае в будущем, это не будет серьезным переоснащением. OO - ваш друг: -)

Мои 0,02 доллара

6
ответ дан 24 November 2019 в 00:36
поделиться

прокомментируйте аргументы «частного конструктора»: давайте, разработчики не такие тупые; но они ленивы. создание объекта, а затем вызов статических методов? этого не произойдет.

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

3
ответ дан 24 November 2019 в 00:36
поделиться
  • Final class and private constructor (good but not essential)
  • Public static methods
2
ответ дан 24 November 2019 в 00:36
поделиться

Нет смысла объявлять класс как статический . Просто объявите его методы static и вызовите их из имени класса как обычно, как класс Java Math .

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

1
ответ дан 24 November 2019 в 00:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: