Java 为了只读对象的目的,仅与选定的几个类共享接口
我有一个巨大的数据存储库,数千个对象。这是一个简化的界面:Java 为了只读对象的目的,仅与选定的几个类共享接口,java,Java,我有一个巨大的数据存储库,数千个对象。这是一个简化的界面: public interface Score { public Float getValue(); public void setValue(Float newValue); } public interface UnmodifiableScore { public Float getValue(); } public interface Score extends UnmodifiableScore {
public interface Score {
public Float getValue();
public void setValue(Float newValue);
}
public interface UnmodifiableScore {
public Float getValue();
}
public interface Score extends UnmodifiableScore {
public void setValue(Float newValue);
}
现在,大型存储库将这些对象保存在索引中,以便快速检索,因此不要在存储库上下文之外调用setValue
非常重要。事实上,我不希望存储库的客户端更改score对象的任何部分
起初我认为我应该返回分数的副本,但那会非常昂贵-数据经常被查询。我的下一个想法是制作一个不可修改的分数
界面:
public interface Score {
public Float getValue();
public void setValue(Float newValue);
}
public interface UnmodifiableScore {
public Float getValue();
}
public interface Score extends UnmodifiableScore {
public void setValue(Float newValue);
}
然后,我的存储库可以返回UnmodifiableScore
s
显然,代码的客户可以降低到分数
s,并根据自己的意愿更改值。仍然有可能更改中央存储库中的值并破坏整个过程。但这将节省大量的复制
我认为就我们的目的而言,命名约定足以提醒我们不要修改分数。但是,如果我们将代码作为库发布,我就没有那么自信了。是否有某种方法可以使只有少数特权类可以看到读/写接口?这个中央存储库需要它,我的服务器也需要它(两个不同的包),但是其他人都可以使用只读接口。有什么聪明的方法可以做到这一点吗?任何模拟<代码>朋友<代码>的C++(< p>),在java中没有等同于<代码>朋友< /> > <
更多信息,请访问:
鉴于此,您需要更改设计,以防止客户对数据进行修改,您可以提供一个客户端ClientScoreView
接口,在该接口中您没有setter,并将Score
设置为包保护或受保护,这样客户端就不会获得Score可以创建一个具有包私有的set方法的Score类(非接口),允许您锁定可以调用set方法的类的数量。这对您来说有些限制,但是可行的
下边是如果有人愿意在你的例子中真正沮丧的话,他们可能也愿意用反射来达到这个值。 我会认真考虑让<代码>得分<代码>不变。它使关于程序的推理变得更加容易,并且您不必担心其他代码所做的更改
PS关于类名的注释:UnmodifiableScore
最好称为ReadableScore
,因为子类不一定是不可修改的。但是如果我使Score
包受保护或保护,我只能在单个包中使用它,对吗?我需要它在两个不同的包中—我的客户端数据存储和服务器端数据存储。