差分

2015-05-17 24 views
1

場景:差分

[更新] 類債權人可以是組織或人員的類型。債權人可以是A型,B型或C型。這裏A型是Org,B型是Personnel。我想知道如何以最好的Java-ISH方式實現這一點。

  1. 這兩個類都實現了一個接口,並且這個第三個類是這些類實現的接口的一個實例。 (使用接口作爲一種類型)

OR

  • 有一個通用的類,所以我可以實例化我想要的任何類? (使用泛型類)
  • 哪個更優選或者是他們完全不同的 的事情嗎?我錯過了什麼?還有解釋。

    我有以下兩類組織和人員。

    public class Org implements Entity{ 
        private String name; 
    
        public String getName(){ 
        return this.name; 
        } 
    
        public void setName(String name){ 
        this.name = name; 
        } 
    
        public Org(String name){ 
        this.setName(name); 
        } 
    } 
    
    public class Personnel implements Entity{ 
        private String name; 
    
        private String phoneNumber; 
    
        public String getName(){ 
        return this.name; 
        } 
    
        public void setName(String name){ 
        this.name = name; 
        } 
    
        public void setPhoneNumber(){..} 
    
        public Personnel(String name){ 
        this.setName(name); 
        } 
    } 
    

    所述接口實體,以上的類實現」

    interface Entity{ 
        String getName(); 
    } 
    

    情況1和情況2的代碼如下。

    情況1

    在這裏,第三類命名債權人可以是一個組織或一個人員,所以我已經添加了一個實體界面作爲類型,以將此類債權人的這個 引用爲組織或個人對象。

    public class Creditor{ 
    
        public Entity entity; 
    
        public Creditor(Entity entity){ 
        this.entity = entity; 
        } 
    
        public static void main(String[] args){ 
        Org o = new Org("Name"); 
        Creditor c = new Creditor(o); 
        Personnel p = new Personnel("AJ"); 
        Creditor c1 = new Creditor(p); 
        } 
    } 
    

    OR

    病例2

    而不是使用接口,爲什麼不讓我使用泛型類型框和實例按心願我想要的對象,像 例如人事或組織。

    public class Creditor<T> { 
        private T t; 
    
        public Creditor(T t){ 
        this.t = t; 
        } 
    
        public static void main(String[] args){ 
        Org o = new Org("Name"); 
        Personnel p = new Personnel("AJ"); 
        Creditor<Org> c1 = new Creditor<>(o); 
        Creditor<Personnel> c2 = new Creditor<>(p); 
        } 
    } 
    
    +0

    我猜*案例中的代碼加倍*情況1說清楚了,這不是一個好方法。如果你創建2個'Creditor'可以使用的額外類,會發生什麼?創建越來越多的構造函數?使用案例2並將您的類更改爲'public class Creditor '。 – Tom

    +0

    因爲投票人沒有評論他/她爲什麼這樣做,因此得票最多。 – Ruraj

    +1

    除非你告訴我們你想用'Creditor'做什麼,我們不能給你一個答案。 @Tom:如果你不寫'Creditor(Entity)'構造函數,那麼只有重複的代碼。 – fabian

    回答

    1

    實際上有在溶液2溶液1 CreditorCreditor<T extends Entity>之間沒有區別,除了以下事實:Creditor<T extends Entity>是參數其他。

    這樣的優勢和解決方案2不便之處是那些參數化:

    • 主要優點是可以保證安全的鑄造
    • 它增加了一些形式主義,這可能是一種優勢,也是一種方便。例如,你將不得不參數Creditor變量的所有聲明,如果你不能這樣做,會得到令人討厭的警告,如果大多數情況是這樣,這會變得非常難看。

    如果您不知道,我建議您從解決方案2開始並刪除參數化,如果您發現不便之處超出優勢。重構將更容易從解決方案2到解決方案1.

    1

    有沒有真正的答案給你的問題。在每種方式中都有優點和缺點,取決於新的Crediator課程的用途。 例如,使用泛型方法的一個親的是,如果返回的內部對象,像這樣:

    Org o = c1.get(); 
    

    沒有施法回所需要的真正的類型。 因此,試着考慮你的班級將如何看待,並由此來決定哪些更適合你的需求。

    +0

    其實在代碼中隱藏了一個表演。編譯器將該代碼處理爲Org o =(Org)(c1.get());'[(type erasure)](https://docs.oracle.com/javase/tutorial/java/generics/erasure.html )如果您在調用'get'之前將'Creditor '包含一個非'null'值給'Creditor ',那麼您會注意到。真正的好處是編譯器會對這些類型參數進行檢查。 – fabian

    +0

    你說得對,謝謝。 –