Это плохая практика для класса, чтобы иметь только статические поля и методы?
У меня есть класс, который состоит только статических переменных-членов и статических методов. По сути, он служит в качестве универсального класса полезности.
это плохая практика для класса, который должен содержать только статические переменные-члены и статические методы?
14 ответов:
Нет, я так не думаю. Хуже всего иметь класс, полный методов экземпляра, которые на самом деле не зависят от конкретного экземпляра. Делая их статическими, пользователь точно знает, как они предназначены для использования. Кроме того, таким образом можно избежать ненужных экземпляров.
EDIT: как запоздалая мысль, в общем, я думаю, что приятно избегать использования языковых функций "просто потому", или потому, что вы думаете, что это "Java-способ сделать это". Я вспоминаю свою первую работу где у меня был класс, полный статических методов утилиты, и один из старших программистов сказал мне, что я не полностью использовал силу Oo Java, сделав все мои методы "глобальными". Она не была в команде 6 месяцев.
до тех пор, пока класс не имеет внутреннего состояния и по существу является так называемым конечным классом (служебные классы попадают в эту категорию), другими словами, он не зависит от других классов. Все нормально.
на
Mathкласс является ярким примером.
звучит разумно.
Примечание: классы, которые делают это часто имеют частный конструктор no-arg просто так, что компилятор выдает ошибку, если программист пытается создать экземпляр статического класса.
статические методы не беспокоят меня много (за исключением тестирования).
В общем, статические члены являются проблемой. Например, что делать, если ваше приложение кластеризовано? Как насчет времени запуска - какая инициализация происходит? Для рассмотрения этих вопросов и многое другое, проверьте в этой статье Гилад Брача.
Это вполне разумно. Фактически, в C# вы можете определить класс с ключевым словом static специально для этой цели.
просто не увлекайтесь этим. Обратите внимание, что Java.ленг.Математический класс - это только математические функции. У вас также может быть класс StringUtilities, который содержит общие функции обработки строк, которые не входят в стандартный API, например. Но если ваш класс называется Utilities, например, это намек на то, что вы можете разделить его.
обратите внимание также, что Java специально представила статический импорт: (http://en.wikipedia.org/wiki/Static_import)
статический импорт-это введенная функция на языке программирования Java это определенные члены (поля и методы) в классе как публичная статика для использования в коде Java без указания класс, в котором определено поле. Эта функция была введена в язык в версии 5.0.
функции обеспечивает контроллеру механизм включения констант в код без необходимости ссылаться на класс, который первоначально определил поле. Это также помогает осуждать практика создания постоянной интерфейс: интерфейс, который только определяет константы, а затем пишет класс реализация этого интерфейса, который является считается нецелесообразным использование интерфейсы[1].
механизм можно использовать для ссылки отдельные члены а класс:
import static java.lang.Math.PI; import static java.lang.Math.pow;или все статические члены класса:
import static java.lang.Math.*;
The коллекции класс в Java SDK имеет только статические члены.
Итак, вы идете, пока у вас есть надлежащее обоснование-это не плохой дизайн
служебные методы часто помещаются в классы только со статическими методами (например,
StringUtils.) Глобальные константы также помещаются в свой собственный класс, так что они могут быть импортированы остальной частью кода (public final staticатрибуты.)оба использования довольно распространены и имеют частные конструкторы по умолчанию, чтобы предотвратить их создание. Объявление класса final предотвращает ошибку при попытке переопределить статические методы.
Если
static member variablesвы не имели в виду глобальный константы, вы можете поместить методы, обращающиеся к этим переменным, в свой собственный класс. в таком случае, не могли бы вы совершенным на то, что эти переменные в коде?
обычно так создаются классы утилит, и в этом нет ничего плохого. Известные примеры включают
o.a.c.l.StringUtils,o.a.c.d.DbUtils,o.s.w.b.ServletRequestUtilsи т. д.
согласно жесткой интерпретации объектно-ориентированного дизайна, класс полезности-это то, чего следует избегать.
проблема в том, что если вы следуете жесткой интерпретации, то вам нужно будет заставить свой класс в какой-то объект для того, чтобы выполнить многие вещи.
даже дизайнеры Java делают служебные классы (java.ленг.Математика приходит на ум)
ваши возможности:
double distance = Math.sqrt(x*x + y*y); //using static utility classvs:
RootCalculator mySquareRooter = new SquareRootCalculator(); mySquareRooter.setValueToRoot(x*x + y*y); double distance; try{ distance = mySquareRooter.getRoot(); } catch InvalidParameterException ......yadda yadda yadda.даже если бы мы избегайте подробного метода, мы все равно можем закончить:
Mathemetician myMathD00d = new Mathemetician() double distance = myMathD00d.sqrt(...);в этом случае .sqrt () все еще статичен, так какой смысл в создании объекта в первую очередь?
ответ заключается в том, чтобы создавать служебные классы, когда другой вариант-создать какой-то искусственный "рабочий" класс, который не имеет или мало использует переменные экземпляра.
эта ссылка http://java.dzone.com/articles/why-static-bad-and-how-avoid кажется, идет против большинства ответов здесь. Даже если он не содержит переменных-членов (т. е. нет состояния), статический класс все равно может быть плохой идеей, потому что его нельзя издеваться или расширять (подкласс), поэтому он побеждает некоторые принципы OO
Я бы не беспокоился о служебном классе, содержащем статические методы.
однако статические члены по существу являются глобальными данными и их следует избегать. Они могут быть приемлемы, если они используются для кэширования результатов статических методов и т. д., Но если они используются в качестве "реальных" данных, которые могут привести к всевозможным проблемам, таким как скрытые зависимости и трудности при настройке тестов.
Comments