请考虑此类:
class ClassA{
private Thing[] things; // stores data
// stuff omitted
public Thing[] getThings(){
return things;
}
}
此类将用于存储数据的数组公开给任何感兴趣的客户端代码。
我是在正在开发的应用中完成此操作的。我有一个ChordProgression
存储序列Chord
s的类(并执行其他一些操作)。它有一个Chord[] getChords()
返回和弦数组的方法。当必须更改数据结构(从数组更改为ArrayList)时,所有客户端代码都将中断。
这让我思考-也许以下方法更好:
class ClassA{
private Thing[] things; // stores data
// stuff omitted
public Thing[] getThing(int index){
return things[index];
}
public int getDataSize(){
return things.length;
}
public void setThing(int index, Thing thing){
things[index] = thing;
}
}
现在,不再公开数据结构本身,而是使用委托给数据结构的公共方法,由数据结构提供的所有操作直接由包含它的类提供。
当数据结构更改时,仅这些方法就必须更改-但更改后,所有客户端代码仍然有效。
请注意,比数组更复杂的集合可能需要封闭的类来实现甚至三个以上的方法来访问内部数据结构。
这种方法常见吗?你觉得这怎么样?它还有什么缺点?让封闭的类至少实现三个公共方法以委托给内部数据结构是否合理?
get(index)
,add()
,size()
,remove(index)
,和remove(Object)
。使用建议的技术,包含此ArrayList的类必须具有五个公共方法才能委托给内部集合。此类在程序中的用途很可能不是封装此ArrayList,而是执行其他操作。ArrayList只是一个细节。[...]