我需要在我的程序中管理数据,其中Java-Vector适用于同步的目的,提供动态大小和通过索引快速随机访问。
但是我想让我的Vector Read Only用于其他程序类和Read Write for my own Class。
我读过关于Collections.unmodifiableList()
的内容,但是如果我让我的Vector
无法修改,它也将成为我班级的只读。
我该如何解决这个问题?
答案 0 :(得分:4)
我读到了
Collections.unmodifiableList()
,但如果我的Vector无法修改,它也将成为我班级的只读。
我认为你误解了这种方法的作用。实际上,它为现有列表创建了一个不可修改的包装器,使原始列表可以修改。
因此,处理您的要求的方法是执行类似 1 :
的操作private Vector<?> myVector = new Vector<?>();
private List<?> readOnly = Collections.Collections.unmodifiableList((myVector);
public List<?> getList() { return readOnly; }
任何有权访问myVector
的内容仍然可以添加和删除元素。这些更改将通过readonly
对象显示...但该对象上的“更改”操作将无效。
(另一种方法是创建原始Vector
对象的副本,但我很确定它不符合您的要求。)
1 - 请注意,readOnly
对象是List
,而不是Vector
。这不应该是一个问题,除非您错误地将getter声明为返回Vector
。如果你已经这样做了,并且你无法纠正错误,那么你将需要在Evgeniy Dorofeev的回答中创建自己的Vector
子类。否则Collections.unmodifiableList(...)
会很好。
答案 1 :(得分:2)
使其成为您班级的private
成员,并且只使用您提到的功能(public
提供以Collections.unmodifiableList()
方式访问该向量的getter的不可变版本的getter。 )。
答案 2 :(得分:2)
如果你真的想要一个不可修改的Vector(不仅仅是List),那就创建一个方法
public static Vector unmodifiableVector(Vector v) {
return new Vector(v) {
@Override
public void add(int index, Object element) {
throw new UnsupportedOperationException();
}
@Override
public synchronized boolean addAll(Collection c) {
@Override
public synchronized void addElement(Object obj) {
// ... other mutators
}
}
答案 3 :(得分:1)
试试这个:
Collections.unmodifiableList(myList);
答案 4 :(得分:0)
让vector成为您班级的私人成员。向调用者公开一个公共方法,该方法将获得对unmodifiableCollection的引用。
public Vector getVector(){
return Collections.unmodifiableList(yourVector) ;
}
要在内部类中使用,您可以直接引用向量,也可以创建一个private
方法,该方法将返回对集合的引用。
private Vector getMyVector(){
return yourVector ;
}
答案 5 :(得分:0)
我认为,如果您将Vector
private
成员属性与write methods
private
同时read methods
public
private Vector<T> myVector = ...
private void setMyVector(Vector<T> vector){
myVector = vector;
}
private void addElement(T element){
myVector.add(element);
}
public T getElement(int indx){
return myVector.get(indx);
}
....
....
{{1}} ,你会确定,例如
{{1}}
答案 6 :(得分:0)
通过将矢量实例设为私有并将setter设置为私有,getter为public,这将是我认为的正确路径。 对于:
List<T> readOnlyList = Collections.unmodifiableList(myList);
它将是readnoly实例,但是,它仍然允许访问其他类来调用add / set / remove方法,但调用这些方法会导致引发UnsupportedException。
此外,根据您的要求,您正在寻找更新其中新元素的向量/添加。因此,可以通过查找并发包来使其更安全。
答案 7 :(得分:0)
最好给你的Vector副本,而不是给你的Vector的原始参考如下:
Vector vector = // your vector object in your class
public Vector<String> getMyVercorObject(){
return (Vector<String>)vector.clone() ;
}
答案 8 :(得分:0)
最好的方法是在内部使用Vector
,仅使用方法公开突变(添加,删除等),并且仅使用接口(List
)返回不可修改的视图。这样的实现可能看起来像这样(例如,让我们说元素是字符串):
private final List<String> list = new Vector<String>();
/** Adds the specified element. */
public void addElement(String element) {
list.add(element);
}
/** Replaces all elements. */
public void setElements(List<String> newElements) {
list.clear();
list.addAll(newElements);
}
/** Returns all elements. */
public List<String> getElement() {
return Collections.unmodifiableList(list);
}
通过这种方式,您的类可以完全访问列表,而外部实体只能使用公共方法进行变异。
请注意,Vector
几乎没有使用过。如果您需要线程安全列表,请将ArrayList
与synchronizedList
结合使用:
private final List<String> list = Collections.synchronizedList(new ArrayList<String>());