Одиночные элементы и константы

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

//C#
private static readonly int MyConstant = xxx;

//Java
private static final int MyConstant = xxx;

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

В это время у меня было 3 варианта:

  1. Определить их в различных классах, которым был нужен он. Это приводит к повторению. Если бы некоторой причиной позже я должен изменить одного из них, я должен был бы зарегистрироваться во всех классах для замены их везде.
  2. Определить статический класс/одиночный элемент со всеми константами как общественность.
  3. Если бы мне была нужна константа X в ClassA, ClassB и ClassC, то я мог бы просто определить его в ClassA как общественность, и затем сделать ClassB, и ClassC обращаются к ним. Это решение не кажется, что хороший мне, поскольку оно представляет еще больше зависимостей, поскольку классы уже имеют между ними.

Я закончил тем, что реализовал свой код со второй опцией. Это - лучшая альтернатива? Я чувствую, что, вероятно, пропускаю некоторую другую лучшую альтернативу.

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

Спасибо

править: Я использую это главным образом для составных типов, не ints и строки. По крайней мере, в случае C#, который имеет значение, поскольку это означает, что я не могу использовать const ключевое слово.

9
задан devoured elysium 3 May 2010 в 09:12
поделиться

6 ответов

Никаких слов о C #, но в Java есть несколько способов решить эту проблему.

  1. Измените модификатор доступа на значение по умолчанию (только для пакетов) или общедоступное . Самое простое решение.

  2. Сгруппируйте их в частном пакете или общедоступном перечислении . Наиболее просто, если эти значения связаны друг с другом. Например. Role.ADMIN , Role.USER , Role.GUEST и т. Д.

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

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

Константы не требуют доступа экземпляра, поэтому идея синглтона в целом не имеет смысла.

5
ответ дан 4 December 2019 в 13:46
поделиться

Свойство ConfigurationManager.AppSettings в .Net существует именно по этой причине. Вы помещаете настройки в файлы конфигурации, предполагая, что это элементы, которые вы хотите установить в одном месте, например. для веб-сайта, использующего ASP.Net, web.config - это одно место, где можно разместить настройки, чтобы каждая среда разработки, тестирования и производственная среда могли иметь разные настройки в том, как они работают.

2
ответ дан 4 December 2019 в 13:46
поделиться

Используйте файл свойств и поместите туда константы.

5
ответ дан 4 December 2019 в 13:46
поделиться

Один из подходов к этому - использование Spring, доступного как в Java, так и в .NET.

www.springsource.org
www.springframework.net - .net

В противном случае я бы использовал файл конфигурации.

0
ответ дан 4 December 2019 в 13:46
поделиться

Что касается int, я обычно использую enum в C#

public enum MyMagicNumbers
{
    TheFirst = 1,
    TheSecond = 2,
    TheLast = 10,
}

Для других типов - как уже упоминал BalusC - герметичный класс - это все, что вам нужно

public sealed class MyMagicStuff
{
    private MyMagicStuff() {}

    public const string TheFirst = "One";
    public const string TheSceond = "Two";
    public const string TheLast = "Ten";
}
2
ответ дан 4 December 2019 в 13:46
поделиться

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

1
ответ дан 4 December 2019 в 13:46
поделиться