2010-05-02 86 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