2017-01-18 30 views
2

我有一個抽象類(RandomEvent),其中包含一個Hashmap(sampleSpace with sample measure)。這個HashMap必須填充在子類中。 有沒有辦法讓它只在子類中可見和可編輯,而不是在放置抽象類的同一個包中? 在我看來,這隻能用java類來解決......也許有一些模式? 這是我做過什麼: 將項添加到來自兒童類的集合

public abstract class RandomVariable<Sample> { 

    private final Hashtable<Sample, Integer> sampleSpace; 
    private boolean setted; 

    public RandomVariable() { 
     sampleSpace = new Hashtable<>(); 

     setted = false; 
     setSampleSpace(); 
     setted = true; 
    } 

    public Sample fireEvent() { 
     //return one sample chosen randomly according to the probability measure 
    } 

    protected Map<Sample, Integer> getSampleSpace() { 
     if(setted==true) { 
      Map<Sample, Integer> ret = new Hashtable<>(); 
      ret.putAll(sampleSpace); 
      return ret; 
     } 
     return sampleSpace; 
    } 

    protected abstract void setSampleSpace(); 

    public double getProbability(final Set<Sample> subset) { 
     //return probability of a subset of the sample space 
    } 

    public double getProbability(Sample sample) { 
     //return probability a the sample 
    } 

    public boolean isSetted() { 
     return setted; 
    } 
} 

所以setSampleSpace()方法中的少兒班,將確定一個具體的隨機事件(具有精確的樣本集)中實現。 下面一個例子:

public class Coin extends RandomVariable<String> { 
    @Override 
    protected void setSampleSpace() { 
     if(!isSetted()) { 
      super.getSampleSpace().put("head", 1); 
      super.getSampleSpace().put("back", 1); 
     } 
    } 
} 

在C++中,我會剛剛宣佈HashMap中作爲保護,但現在我STUDING Java和它似乎有在訪問修飾符一定的差異。 感謝您的答案!

回答

0

我可能會用子類將Map填入初始數據,然後將該引用保存爲Map作爲不可修改的映射。這應該有助於擺脫你的setted變量。

public abstract class RandomVariable<Sample> { 
    private final Map<Sample, Integer> sampleSpace; 

    public RandomVariable() { 
     Map<Sample, Integer> map = new HashMap<>(); 
     populateSampleSpace(map); 
     this.sampleSpace = Collections.unmodifiableMap(map); 
    } 

    protected abstract void populateSampleSpace(Map<Sample, Integer> sampleSpace); 
} 

然後一個子類將只需要數據添加到提供給populateSampleSpace()Map,和父類可以保證填充數據後,即sampleSpace不能修改。

0

實現這一目標的唯一方法是爲抽象類及其實現創建一個子包。例如:

org.example.application.random.RandomVariable 
org.example.application.random.impl.Coin 

然後用將其從包裝外,這些類時,你會得到你想要的你的API的封裝水平。