Java - 扩展ArrayList,使方法变得私有

时间:2015-09-09 08:11:18

标签: java arraylist private extend extends

我试图将ArrayList扩展为仅使add函数可用。然后我创建了一个AlExtend的对象,但除了add()之外我仍然可以访问所有其他方法。如何创建允许AlExtend对象仅使用add()函数的代码?

    import java.util.ArrayList;
public class AlExtend<E> extends ArrayList<E> {

    public AlExtend() {
        super();
    }

    @Override
    public boolean add(E e) {
        return super.add(e);
    }
 }

  public class main {
    public static void main(String[] args) {
          ALExtend<String> list = new ALExtend<String>();       
          list.add("fg");
          list.clear();
    }
}

4 个答案:

答案 0 :(得分:5)

继承不会为您提供所需的行为。改用构图。将ArrayList个实例设为您班级的私有成员,并仅授予其add方法的访问权限。

import java.util.ArrayList;
public class AlExtend<E> 
{
    private ArrayList<E> list = new ArrayList<E> ();
    public AlExtend() {
        super();
    }

    public boolean add(E e) {
        return list.add(e);
    }
}

答案 1 :(得分:1)

你不能。

在OOP中,您无法通过继承来降低属性/方法的可见性。如果您希望只使用选定的方法拥有自己的List,则最好使用委托而不是继承

答案 2 :(得分:1)

无法重写超类(或接口)可见性较低的方法。

唯一的可能性是创建新类不实施 a java.util.List不延伸 ArrayList ,但只有&#34; 包含&#34;它。 仅在新类中公开方法add,调用列表的相应方法。

public class OnlyAddList<E> {
    private List<E> originalList;

    public OnlyAddList(List<E> originalList) {
        this.originalList = originalList);
    }

    public void add(E element) {
        originalList.add(element);
    }
}

注意:使用接口List而不是具体的类ArrayList作为参数,这样您的新类就更灵活了。使用接口而不是具体类是良好的面向对象编程实践之一。请参阅Dependency Inversion Principle

答案 3 :(得分:1)

用户委派而不是继承。

import java.util.ArrayList;

public class AlExtend<E> {
    private ArrayList<E> list;

    public AlExtend() {
        list = new ArrayList<E>();
    }

    public boolean add(E e) {
        return list.add(e);
    }
}
相关问题