Java - 扩展 ArrayList,使方法私有化

3

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

    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();
    }
}

你不能通过继承另一个对象来神奇地使方法消失,这就是继承的原则以及为什么要使用它的原因... - SomeJavaGuy
4个回答

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);
    }
}

啊!这正是我在找的。简直太简单了,哈哈..谢谢! - JavaProgrammer

1

你无法做到。

在面向对象编程中,你不能通过继承来降低属性/方法的可见性。如果你想拥有一个只有特定方法的自己的List,最好使用委托而不是继承。


1
无法将超类(或接口)的可见性降低并重写方法。
唯一可能的方法是创建一个新类,不实现java.util.List并且不扩展ArrayList,而只是“包含”它。在新类中仅暴露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,这样您的新类就更加灵活。使用接口而不是具体类是良好的面向对象编程实践之一。参见依赖倒置原则


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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接