Подтвердить что ты не робот

Использование частных статических методов

Что вы думаете об использовании приватных статических методов?

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

Но я слышал, что эта практика нарушает принципы ООП.

Редактирование: мне интересно, как выглядит стиль, а не производительность.

4b9b3361

Ответ 1

A private static сам по себе не нарушает ООП как таковой, но когда у вас есть много этих методов в классе, который не нужен (и не может *) обращаться к полям экземпляра, вы не программируете в OO так как "объект" подразумевает состояние + операции над этим состоянием, определенным вместе. Почему вы помещаете эти методы в этот класс, если они не нуждаются в каком-либо состоянии?

(*) = В принципе, из-за видимости уровня класса в Java статический метод в классе имеет доступ к полям экземпляра объекта этого класса, например:

class Test
{
  int field = 123;

  private static void accessInstance(Test test)
  {
    System.out.println(test.field);
  }
}

Вам нужно, конечно, передать ссылку на экземпляр (this pointer), но тогда вы, по сути, имитируете методы экземпляра. Просто упомянем об этом для полноты.

Ответ 2

Как упоминалось выше, частные статические методы часто полезны для организации повторно используемой логики и сокращения/исключения повторяющегося кода. Я удивлен, что в этой дискуссии я не заметил упоминания о производительности. От Рено Вальдуры "Заключительное слово на финале":

(Обратите внимание: частные статические методы неявно окончательно)

"Поскольку окончательный метод реализуется только в объявляющем классе, нет необходимости динамически посылать вызов окончательному методу, и вместо этого может использоваться статический вызов. Компилятор может испускать прямой вызов метода, минуя полностью обычная процедура вызова виртуального метода, из-за чего конечные методы также являются кандидатами на встраивание компилятором Just-In-Time или аналогичным инструментом оптимизации (помните, что частные/статические методы уже являются окончательными, поэтому всегда учитываются для этой оптимизации.)"

Посмотрите всю бумагу: http://renaud.waldura.com/doc/java/final-keyword.shtml

Ответ 3

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

Ответ 4

Я не обязательно вижу какую-либо реальную проблему с тем, что вы делаете, но мой первый вопрос состоял бы в том, что если метод не требует доступа к каким-либо полям экземпляра, то что он делает в этом классе в первую очередь?

Ответ 5

Это вопрос вкуса, но я делаю методы, которые не реагируют на состояние в статическом объекте. Таким образом, мне не нужно переписывать код, если статическая функция нуждается в подобной функциональности. Хорошим примером такого случая будет функция сортировки.

Ответ 6

Я стараюсь не использовать частные статические методы. Я использую общедоступные статические методы и группирую их в классы Util, чтобы продвигать повторное использование.

Ответ 7

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

Основным недостатком использования статических методов является, на мой взгляд, тот факт, что один отбрасывает возможность переопределения. Поскольку классы в Java не похожи, скажем, на классы в Smalltalk, вы не можете переопределять статические методы.

Поскольку ваш вопрос относится к приватным статическим методам, переопределение в любом случае не подходит.

Я использую статические методы только в случае классов полезности (например, java.lang.Math) или шаблонов, подобных шаблону Singleton. Все они требуют более высокой видимости, чем частные, поскольку они представляют услуги, предоставляемые их классом другим.

Заключительная мысль: если у вас есть один или несколько частных статических методов, подумайте о том, чтобы извлечь их в выделенный класс утилиты и сделать их общедоступными. Еще лучше, сделайте им методы экземпляра и используйте шаблон Singleton.