Java中的不可修改的向量

时间:2012-12-19 05:10:58

标签: java

我需要在我的程序中管理数据,其中Java-Vector适用于同步的目的,提供动态大小和通过索引快速随机访问。

但是我想让我的Vector Read Only用于其他程序类和Read Write for my own Class。

我读过关于Collections.unmodifiableList()的内容,但是如果我让我的Vector无法修改,它也将成为我班级的只读。

我该如何解决这个问题?

9 个答案:

答案 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几乎没有使用过。如果您需要线程安全列表,请将ArrayListsynchronizedList结合使用:

private final List<String> list = Collections.synchronizedList(new ArrayList<String>());