2012-08-19 46 views
2

我正在使用現有代碼來增強功能。構造函數重載中的設計問題

在現有的代碼中,我看到有多個帶字符串參數的構造函數。像

public class A { 
    public A(String a){ 
    } 

    public A(String a, String b){ 
    } 

    public A(String a, String b, String c){ 
    } 
} 

雖然增強我發現我需要另一個字符串參數添加到構造函數。 但是,這似乎是問題,可能有另一個增強,我必須添加花葯字符串。

我想避免這種情況。

什麼可能是避免這種情況的最佳設計?

好的解決方案是使用HashMap?

+0

這是有關Java? (你沒有在你的問題中指定語言,我只是根據提及的'HashMap'來推斷。) – 2012-08-19 20:39:49

+0

是的,你可以說這是關於java的。但是這個問題可能會以任何語言出現。 – 2012-08-19 20:43:27

+0

我已添加標籤。對於將來的問題,請在您的問題中更具體地開始 - 通常不同的語言會鼓勵不同的設計習慣用法。 – 2012-08-19 20:44:25

回答

2

好的解決方案是使用HashMap?

你不是很清楚你想要解決什麼問題,但是你可能想要考慮將參數封裝在另一個類中 - 也許是一個可變參數,遵循構建器模式。這將使你的東西,如:

FooParams params = new FooParams().withA("a value") 
            .withB("b value") 
            .withC("c value"); 
Foo foo = new Foo(params); 

(你甚至可以在一個FooParams方法buildFoo(),以保持整個事情流暢。)

2

與使用varargs的解決方案嘗試。

public class A { 
    public A(String ... args) { 
     // Add some logic that validates number of input parameters etc. 

     for (String arg : args) { 
      ... 
     } 
    } 
} 

你可以這樣調用:

A a1 = new A("tagA: value1", "tagB: value2", "tagC: value3"); 
A a2 = new A(); 
A a3 = new A("<tagA>234</tagA>"); 
+0

這可以工作,但然後參數順序仍然需要提前確定和已知。我認爲這個問題變成了,如果每個參數都是一個字符串,那麼它的順序並不總是很明顯。我更喜歡Builder模式的想法,只是因爲它模擬了命名參數。 – 2012-08-19 21:20:10

+1

@DougSwain對此表示贊同。但是由於OP沒有告訴我們他的課程是什麼,那麼也許這是一個有效的解決方案。也許他只想拿一些字符串和操作。 – maba 2012-08-19 21:22:14

+0

該類用於維護關於文件的元數據。 – 2012-08-19 21:25:42