2009-03-26 3 views
31

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

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

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

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

+0

Спасибо. Не удалось найти его. –

ответ

34

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

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

class Test 
{ 
    int field = 123; 

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

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

+0

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

2

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

+0

Это может произойти, когда мне нужно применить специальные проверки входных параметров в каком-то общедоступном методе. Как какой-то небольшой вспомогательный метод. –

+0

... или когда вы имеете дело со статическими полями, очевидно = 8-) – Yuval

+0

@ Андрей - это имеет смысл. Как я уже сказал, это только первый вопрос, который я задал себе, если бы я нашел то же самое. Часто эти «вспомогательные» методы могут быть полезны для других вещей и лучше реорганизуются в другой класс. Но потом, иногда они не слишком :) –

0

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

3

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

0

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

+1

А как вы относились к методам, которые слишком специфичны для совместного использования? Для некоторой общей функциональности я также извлекаю методы для классов полезности. –

+1

Urgh. Не группируйте методы случайным образом. –

0

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

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

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

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

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

19

Как упоминалось выше, частные статические методы часто полезны для организации повторно используемой логики и сокращения/исключения повторяющегося кода. Я удивлен, что в этой дискуссии я не заметил упоминания о производительности. От Renaud Waldura «The Заключительного слова о Final»:

(Примечание, частные статические методы неявно конечные)

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

Отъезд t он целая бумага: http://renaud.waldura.com/doc/java/final-keyword.shtml