Я делаю программу, которая использует несколько констант. Сначала, каждый раз, когда я должен был использовать константу, я определю ее как
//C#
private static readonly int MyConstant = xxx;
//Java
private static final int MyConstant = xxx;
в классе, где мне был бы нужен он. Через какое-то время я начал понимать, что некоторые константы будут необходимы больше чем в одном классе.
В это время у меня было 3 варианта:
Я закончил тем, что реализовал свой код со второй опцией. Это - лучшая альтернатива? Я чувствую, что, вероятно, пропускаю некоторую другую лучшую альтернативу.
Что волнует меня по поводу использования одиночного элемента, вот то, что пользователю класса нигде не ясно, что этот класс использует одиночный элемент. Возможно, я мог создать ConstantsClass, который содержал все необходимые константы, и затем я передам его в конструкторе к классам, этому был бы нужен он?
Спасибо
править: Я использую это главным образом для составных типов, не ints и строки. По крайней мере, в случае C#, который имеет значение, поскольку это означает, что я не могу использовать const
ключевое слово.
Никаких слов о C #, но в Java есть несколько способов решить эту проблему.
Измените модификатор доступа на значение по умолчанию (только для пакетов) или общедоступное
. Самое простое решение.
Сгруппируйте их в частном пакете или общедоступном
перечислении
. Наиболее просто, если эти значения связаны друг с другом. Например. Role.ADMIN
, Role.USER
, Role.GUEST
и т. Д.
Объявите их в закрытом пакете или общедоступном
interface
и позвольте классам реализовать его. Делайте это только в том случае, если эти константы принадлежат некоторому контракту, которому должны соответствовать классы.
Поместите их в файлы свойств и загрузите как частные статические окончательные свойства
и добавьте общедоступную статическую строку getProperty (строковый ключ)
. Оберните это в какой-нибудь частный пакет или общедоступный
класс конфигурации
.Более полезно, если эти константы могут быть чувствительными к изменениям, которые вы затем можете контролировать извне.
Константы не требуют доступа экземпляра, поэтому идея синглтона в целом не имеет смысла.
Свойство ConfigurationManager.AppSettings в .Net существует именно по этой причине. Вы помещаете настройки в файлы конфигурации, предполагая, что это элементы, которые вы хотите установить в одном месте, например. для веб-сайта, использующего ASP.Net, web.config - это одно место, где можно разместить настройки, чтобы каждая среда разработки, тестирования и производственная среда могли иметь разные настройки в том, как они работают.
Один из подходов к этому - использование Spring, доступного как в Java, так и в .NET.
www.springsource.org
www.springframework.net - .net
В противном случае я бы использовал файл конфигурации.
Что касается 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";
}
Я бы определил его в одном месте, в одном из классов, которым он нужен. Я бы сделал его статическим, окончательным и публичным, чтобы он был истинной константой, доступной любому другому клиенту, которому он нужен.