我有一个Abstract类(RandomEvent),它包含一个Hashmap(带有示例度量的sampleSpace)。必须在子类中填充此Hashmap。 有没有办法让它只在子类中可见和可编辑但不在我放置Abstract类的同一个包中? 在我看来,这不能仅使用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声明为受保护,但我现在正在研究java,并且似乎在访问修饰符中存在一些差异。 谢谢你的回答!
答案 0 :(得分:0)
实现这一目标的唯一方法是为抽象类及其实现创建一个子包。例如:
org.example.application.random.RandomVariable
org.example.application.random.impl.Coin
然后,当从包外部使用这些类时,您将获得所需的API封装级别。
答案 1 :(得分: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);
}
然后子类只需要将数据添加到提供给Map
的{{1}}中,并且父类可以确保在填充数据后,populateSampleSpace()
不能被修改。