Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为了只读对象的目的,仅与选定的几个类共享接口_Java - Fatal编程技术网

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
包受保护或保护,我只能在单个包中使用它,对吗?我需要它在两个不同的包中—我的客户端数据存储和服务器端数据存储。