单身人士和常数

时间:2010-05-02 21:50:56

标签: c# java oop singleton

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

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

//Java
private static final int MyConstant = xxx;

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

此时,我有3个选择:

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

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

    由于

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

6 个答案:

答案 0 :(得分:5)

使用属性文件并将常量放在那里。

答案 1 :(得分:5)

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

  1. access modifier更改为默认值(仅限套餐)或public。最直接的解决方案。

  2. 将它们分组为私有或public enum。如果这些值相互,则最直接。例如。 Role.ADMINRole.USERRole.GUEST

  3. 在包私有或public interface中声明它们,让类实现它。只有当这些常量属于某些合同时,才能执行此操作。

  4. 将它们放入properties files并加载为private static final Properties并添加public static String getProperty(String key)。将其包含在某些包私有或public Configuration类中。如果这些常量可能对您可以在外部控制的更改敏感,则会更有用。

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

答案 2 :(得分:2)

出于这个原因,.Net中存在

ConfigurationManager.AppSettings Property 。您将设置放入配置文件中,假设这些是您想要在一个地方设置的元素,例如。对于使用ASP.Net的网站,web.config是一个可以放置设置的位置,这样开发,测试和生产环境都可以在运行方式上有不同的设置。

答案 3 :(得分:2)

int而言,我通常在C#中使用enum

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";
}

答案 4 :(得分:1)

我将它定义在一个地方,在一个需要它的类中。我将它设为静态,最终和公共,因此它是真正的常量,可由任何其他需要它的客户端访问。

答案 5 :(得分:0)

一种方法是使用Spring,Java和.NET都可用。

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

否则我会使用配置文件。