2010-05-02 57 views
8

我正在制作一个使用几个常量的程序。起初,每当我需要使用一个常量时,我​​会将它定义为单身人士和常量

//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引用它们。这个解决方案对我来说不太好,因为它们之间已经有了更多的依赖关系。

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

我担心在这里使用单身人士的原因是,这个班级的用户对这个班级使用单身人士并不清楚。也许我可以创建一个ConstantsClass,它包含所有需要的常量,然后将它传递给构造函数中需要它的类?

感谢

编辑:我使用这个多为复杂的类型,而不是整数和字符串。至少在C#的情况下有所作为,因为这意味着我不能使用const关键字。

回答

5

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

  1. 更改access modifier为默认(仅封装)或public。最直接的解决方案。

  2. 将它们分组在一个包 - 私人或publicenum。如果这些值是相关的彼此最直接。例如。 Role.ADMIN,Role.USER,Role.GUEST等。

  3. 声明他们在一个包私人或publicinterface并让这些类实现它。只有在这些常量属于某些契约时才能做到这一点,类也必须遵守。

  4. 将它们放入properties files,并加载为private static final Properties并添加public static String getProperty(String key)。将其封装在一些封装专用或publicConfiguration类中。如果那些常量可能对可以在外部控制的更改敏感,则更有用。

常量不需要被实例访问,所以整个单例思想没有意义。

+0

如果是单身人士,他们当然不会被宣布为静态的。如果在静态类中,或者将它们放入每个需要它的类中,它们只会被声明为静态。 – 2010-05-02 22:03:49

+1

那么这些值实际上不再是**常量**了。不,忘记单身主意。 – BalusC 2010-05-02 22:05:24

1

我想在一个地方定义它,在一个需要它的类中定义它。我会把它变成静态的,最终的和公共的,所以它是真正的不变的,任何其他需要它的客户端都可以访问它。

4

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

+1

为什么我得到dinged? – 2010-05-03 00:46:47

0

对此的一种方法是使用Spring,可用Java和.NET。

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

否则我会使用一个配置文件。

+0

当你的意思是一个配置文件,最后你的意思是使用类似于Singleton的东西? – 2010-05-02 21:59:32

+0

通过配置我的意思是将常量放置在单独的文件中的单个位置,如果它需要更新,可以很容易地找到 - 属于应用程序而不是特定的类。如果你觉得你需要一个单身人士,那么春天将是最理想的选择。 – McAden 2010-05-02 22:20:00

+0

是的,但从设计的角度来看,你正在做的是依赖于最终看起来像一个静态类的东西。你的所有类都依赖于具有“全局”状态的对象。 – 2010-05-02 22:29:14

2

ConfigurationManager.AppSettings Property in .Net就是因为这个原因而存在的。假设这些元素是你想要在一个地方设置的元素,你将这些设置放到配置文件中,例如。对于使用ASP.Net的网站来说,web.config是可以放置设置的一个位置,以便开发,测试和生产环境可以分别具有不同的设置。

+0

是的,但最终成为一个静态类,对吧? – 2010-05-02 22:04:21

+1

也许,但我的观点是,有内置的类来做你所需要的,所以为什么不使用它们呢? – 2010-05-03 02:21:47

2

至于int而言,我通常在C#

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

使用enum对于其他类型的 - 像BalusC已经提到 - 密封类是所有你需要

public sealed class MyMagicStuff 
{ 
    private MyMagicStuff() {} 

    public const string TheFirst = "One"; 
    public const string TheSceond = "Two"; 
    public const string TheLast = "Ten"; 
} 
+0

如果您不能实例化类并且这些字段不是静态的,那么如何使用这些数据呢? – 2010-05-02 22:23:11

+1

@devoured让它们成为'const'就足够了 - 至少在C#中。 – Filburt 2010-05-02 22:36:13

+1

不知道这个事实。无论如何,我的类型很复杂,因此我不能在它们上使用“const”修饰符。 – 2010-05-02 22:40:30