【问题标题】:Java - Extending ArrayList, making methods privateJava - 扩展 ArrayList,使方法私有
【发布时间】:2015-12-05 02:41:27
【问题描述】:

我正在尝试扩展 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();
    }
}

【问题讨论】:

  • 你不能通过从另一个对象扩展来神奇地使方法消失,这就是继承的原理以及使用它的原因......

标签: java arraylist private extend extends


【解决方案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);
    }
}

【讨论】:

    【解决方案2】:

    你不能。

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

    【讨论】:

      【解决方案3】:

      不可能重写一个对其超类(或接口)的可见性较低的方法。

      唯一的可能性是创建一个新类不实现 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 作为参数,这样你的新类就更灵活了。使用接口而不是具体类是良好的面向对象编程实践之一。见Dependency Inversion Principle

      【讨论】:

        【解决方案4】:

        继承不会给你想要的行为。改用合成。将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);
            }
        }
        

        【讨论】:

        • 啊啊!这正是我一直在寻找的。几乎很容易弄清楚哈哈..谢谢!
        猜你喜欢
        • 2014-11-22
        • 2017-10-08
        • 2013-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-29
        • 2011-12-27
        • 2014-06-07
        相关资源
        最近更新 更多