Ява без синглетонов - PullRequest
2 голосов
/ 07 мая 2009

Просто вне интереса: как вы думаете, Java был бы лучшим языком, если бы исключались статические переменные, эффективно заменяя синглтоны на синглтоны? Определение здесь.

Если вы так думаете: не могли бы вы уточнить, какой мотив мог быть для включения его в язык?

Ответы [ 6 ]

7 голосов
/ 07 мая 2009

В той же статье, которую вы цитируете, есть следующее утверждение:

К другим видам синглетонов, которые являются полуприемлемыми, относятся те, которые не влияют на выполнение вашего кода. У них нет «побочных эффектов»

... а затем в статье рассказывается о ведении журнала. Другой типичный пример - печать. Так что это аргументы для синглетонов даже в статье, которая призывает к «давайте избавимся от всех синглетонов».

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

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

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

4 голосов
/ 07 мая 2009

Как вы думаете, Java был бы лучше, если бы статические переменные были бы> исключены, эффективно заменяя синглтоны на синглтоны?

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

Не могли бы вы уточнить, какие мотивы могли быть для включения его в язык

static является сокращением для объектов или методов, которые не обязательно привязаны к данным, оно моделирует поведение без данных экземпляра.

2 голосов
/ 07 мая 2009

Очевидно, что статические константы полезны. Чтобы сделать объект постоянным в Java, вы определяете неизменный тип. В настоящее время в Java немного не хватает константных типов. Например, очень часто можно увидеть статическое поле с (не пустым) массивом, но (будем надеяться_ рассматривать как константу.

Есть относительно немного случаев, когда изменчивая статика имеет смысл. Например, некоторые кэши и добавление внешних полей к существующим объектам. Аналогично, даже константа String имеет изменяемое поле.

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

Однако обычная изменчивая статика, одета ли она как синглтон или нет, определенно может подойти. API-интерфейсы, конечно, будут другими. Это сделало бы мою работу намного проще. Например, механизм SecurityManager будет избыточным.

2 голосов
/ 07 мая 2009

Несмотря на презрение синглетонов и что-либо статическое нефинал, я иногда использую следующую идиому для генерации уникальных идентификаторов для объектов.

private static long idCounter;
private synchronized static long getID() { return idCounter++; }
private final long id = getID();

Так что это один из аргументов в пользу статических нефиналов.

(Или, как отмечает Том Хотин, чуть лучше

private static final AtomicLong idCounter = new AtomicLong();
private final long id = idCounter.getAndIncrement();

)

1 голос
/ 07 мая 2009

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

Синглтон - это зло, потому что он «знает» о себе что-то, чего не должен, а именно, что это единственный экземпляр своего типа во всей системе. Каждый раз, когда информация такого рода инкапсулируется в классе, у вас есть де-факто Singleton.

Что касается того, почему это в Java, я бы предположил, что, как и целый ряд вещей, это компромисс между чистотой ОО и практичностью.

0 голосов
/ 07 мая 2009

Я согласен с DFA. Иногда статика имеет смысл.

Кроме того, это языковая функция, которую тот, кто презирает, может не использовать. Я считаю полезными статику и синглтоны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...