2017-01-18 11 views
2

ハッシュマップ(サンプルメジャーを含むsampleSpace)を含む抽象クラス(RandomEvent)があります。このハッシュマップは、子クラスに作成されなければなりません。 子クラスでのみ表示および編集可能にする方法はありますか?抽象クラスを置くのと同じパッケージにはありませんか? これは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()メソッドは、(正確なサンプルセット付き)、具体的なランダムイベントを定義します子供のクラスで実装する必要があります。 はここで例:保護されたとして、C言語で

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

++私はちょうどHashMapを宣言しているだろうが、私は今の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のカプセル化レベルを取得します。

関連する問題