Является ли статический класс уместным, когда состояние является неизменным? - PullRequest
2 голосов
/ 18 марта 2009

Допустим, у меня есть простой класс с именем WebsterDictionary, в котором есть функция, которая может взять слово и вернуть его определение. Возможно, есть другая функция, которая может принять определение и вернуть слово. Этот класс постоянно используется многими клиентами.

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

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

РЕДАКТИРОВАТЬ: Кроме того, если это становится статическим классом, когда я инициализирую Словарь, так как больше не будет конструктора? Нужно ли проверять, является ли ссылка на словарь нулевой при каждом вызове одного из статических методов?

Спасибо.

Ответы [ 8 ]

2 голосов
/ 18 марта 2009

Статический класс подходит, когда функциональность не нуждается в замене (например, для тестов). Если вы хотите использовать заглушку или макет, вы должны создать соответствующий интерфейс, а затем реализовать его с помощью одиночного кода.

1 голос
/ 18 марта 2009

Статический класс может быть тем, что вы хотите здесь (см. Другие ответы). Но не делайте ошибку, называя ваш словарь «неизменяемым».

Immutable не означает «никогда не может измениться во время выполнения» в том смысле, что вы использовали фразу , потому что ваш словарь на самом деле действительно изменяется во время выполнения; после того, как вы должны создать его, вы также должны добавить элементы. Даже в этот момент вы можете намереваться , что это никогда не изменится, но возможно изменить его. Ваше намерение нигде не реализовано.

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

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

1 голос
/ 18 марта 2009

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

Мой совет: задайте себе один вопрос: развалится ли мир, если я создам более одного из этих объектов? Если это так, используйте одноэлементный или статический класс. В противном случае используйте обычный класс.

0 голосов
/ 18 марта 2009

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

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

0 голосов
/ 18 марта 2009

Звучит очень похоже на описание шаблона Monostate : вы хотите, чтобы один и тот же WebsterDictionary был доступен всем. Так уж получилось, что WebsterDictionary также является неизменным, но это ортогональная проблема: просто сделать невозможным обновление (например, с помощью оболочки только для чтения).

0 голосов
/ 18 марта 2009

То, что вы ищете, может быть Singleton?

Нет необходимости, чтобы статический класс не нуждался в состоянии (он может иметь статические члены как часть его, которые могут быть частью его состояния).

0 голосов
/ 18 марта 2009

Статический класс подходит, когда должен существовать только один «экземпляр», и в этом случае шаблон Singleton может быть или не быть более подходящим (в зависимости от деталей). Для неизменяемого объекта, для которого вам понадобится несколько экземпляров, конечно, статический класс не подходит.

0 голосов
/ 18 марта 2009

Вы можете пойти в Синглтон или Статический класс. Я бы, наверное, пошел с Синглтоном, но я думаю, что это в основном проблема предпочтений в этой конкретной ситуации.

...