单身人士和常数

dev*_*ium 9 c# java oop singleton

我正在制作一个使用几个常量的程序.起初,每次我需要使用常量时,我​​都会将其定义为

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

//Java
private static final int MyConstant = xxx;
Run Code Online (Sandbox Code Playgroud)

在我需要它的班级里.过了一段时间,我开始意识到在一个以上的课程中需要一些常量.

这时,我有3个选择:

  1. 在需要它的不同类中定义它们.这导致重复.如果由于某种原因后来我需要更改其中一个,我必须检查所有类以在任何地方替换它们.
  2. 定义一个静态类/单例,其中所有常量都是公共的.
  3. 如果我在ClassA,ClassB和ClassC中需要一个常量X,我可以在ClassA中将它定义为public,然后让ClassB和ClassC引用它们.这个解决方案对我来说似乎并不好,因为它引入了更多依赖关系,因为它们之间已有类.

我最后用第二个选项实现了我的代码.这是最好的选择吗?我觉得我可能错过了一些其他更好的选择.

在这里使用单例让我担心的是,该类的用户无法清楚该类正在使用单例.也许我可以创建一个包含所有常量所需的ConstantsClass,然后我将它在构造函数中传递给需要它的类?

谢谢

编辑:我主要用于复杂类型,而不是整数和字符串.至少在C#案例中有所作为,因为这意味着我无法使用const关键字.

Rom*_*eau 5

使用属性文件,然后将常量放在其中。


Bal*_*usC 5

没有关于C#的措辞,但在Java中有几种方法可以解决这个问题.

  1. 访问修饰符更改为默认值(仅限包)或public.最直接的解决方案.

  2. 将它们分组为私有或public enum.如果这些值彼此相关,则最直截了当.例如Role.ADMIN,Role.USER,Role.GUEST等.

  3. 在package-private中声明它们,或public interface让类实现它.只有当这些常量属于类必须遵守的某个契约时才这样做.

  4. 将它们放在属性文件中并加载为private static final Properties并添加一个public static String getProperty(String key).将它包装在一些包私有或public Configuration类中.如果这些常量可能对您可以在外部控制的更改敏感,则更有用.

常量不需要被实例访问,因此整个单例概念毫无意义.