2011-11-09 67 views
1

假設我有兩個類。兩者都具有相同的成員字段(包括相同的名稱),但是一個類的成員字段被聲明爲final(不可變),另一個不是。大多數成員方法都適用於這兩個類。Java:兩個類似的類,一個不可變 - 它們之間共享代碼

我怎樣才能與其他類共享不可變類的成員方法(就像通過繼承或其他類),而不必將整個方法複製到另一個類。我認爲沒有這樣的方式,但我想我會先問。否則,我只需在不同的命名空間中聲明它們併爲它們指定相同的類名。應該指出,並非所有的不可變類方法都適用於可變類。

public class ImmutableDoubleLine { 
    public final DoublePoint origin; 
    public final DoublePoint endPoint; 

    // ... 

    public double getLength() { 
     return origin.calcDistance(endPoint); 
    } 
} 

    public class MutableDoubleLine { 
     public DoublePoint origin; 
     public DoublePoint endPoint; 

     // ... 

// same code as immutable class 
     public double getLength() { 
      return origin.calcDistance(endPoint); 
     } 
    } 

回答

2

首先,這是非常重要的。

除非類DoublePoint是內部不可變的,並且它的所有實例變量的路線是內部一成不變,你已經與final DoublePoint origin語句來完成是使參考originendpoint在那裏他們不能改變指向不同的實例,你有不是使ImmutableDoubleLine不可變。

我提到這是因爲您沒有顯示DoublePoint的代碼。

其次,你的實際問題,使用Interface,並有兩個類實現:

public interface DoubleLine 
{ 
    public double getLength(); 
} 

我會試着讓一切不變儘可能,它使調試更加方便,使併發性更容易好。

+0

DoublePoint是不可變的。但這超出了問題的範圍。在可變的DoubleLine中,點可能是可變類型,也... –

+0

@WilliamtheCoderer許多人,我會說最多的,甚至一些「高級」開發人員不明白,使實例變量「final」不會使它指向不變的對象。 'private final List l'不會讓'l'指向不變的'List',這就是我爲什麼要提出它的原因。 –

+0

是的,DoublePoint還宣佈其成員(雙打)爲最終成員。他們不能改變。但是在可變直線類中,它可能會使用具有可更改點的雙點。我還沒有到那個地步。我現在只需要不可變的版本。我希望能夠稍後使用代碼來創建可變版本以添加一些編輯功能。 –

1

你爲什麼要聲明你的字段是公開的?

只是讓它們變得私人並且只在派生類中添加setter。 Immutable類不會有setter,並且字段必須在構造函數中設置。

通過這種方式,您不需要使DoublePoint成爲最終的,但要小心如果您返回它們並且不是最終的,則必須返回它們的防禦副本。

+0

在不可變的類中,它會讓它更容易公開。在可變類中,他們可能是私人的。雖然這個概念保持不變。我仍然想分享他們之間的代碼,但只有一些方法。 –

+0

並且在需要時不要忘記防禦性複製 –

+0

您必須做更多的工作來創建getter(如果需要)以及可變類中的setter,但除了可以共享所有代碼之外。 – stivlo

2

使用組合物。讓其中一個類擁有另一個類的實例,並將成員方法傳遞給內部實例。這是一種門面類。

2

使它們全部繼承於抽象類AbstractDoubleLine,向該類中添加兩個抽象方法getOrigin()getEndPoint(),並使用這些getter實現所有常用方法。

不可變類的獲取者當然應該保證DoublePoint實例的不變性,或者通過使它們不可變或通過防禦性複製來保證。