有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有删除和添加通知的java自定义arraylist

我想在向数组列表添加某些项或从中删除某些项时进行检测。实际上,我有如下代码:

public class myClass {

    MyCustomArrayList<MyObject> al;

    public void method1() {

        al.add(myObject);        
        // Do other works
        al.remove(myObject)
        // Do other works
    }

    private void DoByEachAdd() {
        //I want array list call this method by adding each item to it.
        // It should be in this class because it is doing some works
        // related to this class. for example changing some private variables
    }

    private void DoByEachRemove() {
        // I want array list call this method by adding each item to it.
        // It should be in this class too.
    }

}

我知道数组列表不具备侦听器或某种通知或事件的功能,如果我想检测add,应该有一个自定义数组列表。比如下课:

class MyArrayList<T> {
    private ArrayList<T> list;

    public MyList(){
        list = new ArrayList<>();
    ...
    }
    public void add(T t) {
        list.add(t) {
        //do other things you want to do when items are added 
    }
    public T remove(T t) {
        list.remove(t);
        //do other things you want to do when items are removed
}

(我从here那里得到)

所以问题是:当removeadd方法被激发时,我如何通知调用DoByEachAddDoByEachRemove方法的MyArrayListal)对象。有人有什么想法吗


共 (3) 个答案

  1. # 1 楼答案

    你需要给myClassMyArrayList的访问权限

    class MyArrayList<T> {
        private ArrayList<T> list;
        private myClass theClass;
    
    public MyList(myClass theClass){
        list = new ArrayList<>();
        this.theClass = theClass;
    ...
    }
    public void add(T t) {
        list.add(t) {
        //do other things you want to do when items are added 
        theClass.DoByEachAdd();
    }
    public T remove(T t) {
        list.remove(t);
        //do other things you want to do when items are removed
        theClass.DoByEachRemove
    }
    

    在你的myClass中,把对象放到你的列表中

    public class myClass {
    
       MyCustomArrayList<MyObject> al;
    
    
     public myClass(){
    
      al = new MyCustomArrayList<MyObject>(this);
    
     }
    public void method1() {
    
        al.add(myObject);        
        // Do other works
        al.remove(myObject)
        // Do other works
    }
    
    public void DoByEachAdd() {
        //I want array list call this method by adding each item to it.
        // It should be in this class because it is doing some works
        // related to this class. for example changing some private variables
    }
    
    public void DoByEachRemove() {
        // I want array list call this method by adding each item to it.
        // It should be in this class too.
    }
    
    }
    
  2. # 2 楼答案

    首先,遵循命名惯例。其次,你为同一个类使用的三个类名MyListMyArrayListMyCustomArrayList会让人感到困惑。至于你的问题,你必须在myClass类型的MyArrayList内有一个实例字段(除非你想将DoByEachAddDoByEachRemove重构为static)。这可以通过将其添加为构造函数参数来实现,例如

    // inside MyArrayList
    private ArrayList<T> list;
    private final myClass instance;
    
    public MyArrayList(myClass instance) { // <  NOT MyList
        list = new ArrayList();
        this.myClass = myClass;
    }
    

    此外,我对你的做法表示怀疑。其他具有MyArrayList实例的类只能使用addremove方法。如果你想省去很多麻烦,让所有的方法都可见,要么把list声明为public final,要么把MyArrayList变成ArrayList的子类,例如

    public class MyArrayList<T> extends ArrayList<T> {
        private final myClass instance;
    
        public MyArrayList(myClass instance) { // <  NOT MyList
            list = new ArrayList();
            this.myClass = myClass;
        }
    
        @Override
        public boolean add(T t) {
            boolean returnThis = super.add(t);
            // do some stuff
            instance.DoByEachAdd();
            return returnThis;
        }
    
        @Override
        public boolean remove(T t) {
            boolean returnThis = super.remove(t);
            // do some stuff
            instance.DoByEachRemove();
            return returnThis;
        }
    }
    

    如果坚持要从remove返回T,请声明另一种方法:

    public T removeT(T t) {
        remove(t);
        // do some stuff
        return someT;
    }
    
  3. # 3 楼答案

    您可能需要使用Callback机制

    Java为回调机制提供了接口 使用以下步骤:

    1. 接口是用抽象方法定义的 服务器知道其名称

    2. 当 服务器事件发生时实现接口,从而 给出抽象方法的代码

    3. 当客户机向服务器注册时,服务器 保存引用客户端的实例变量 其类型为接口类型

    4. server类通过调用 该客户端的接口方法

    参考以下代码,并对其进行修改以满足您的要求: 代码用于信用卡应用程序模拟。该要求与您的要求类似,即,在调用某个方法时自动触发某个方法。在下面的代码中,调用pinChanged()方法时会自动调用changePin()方法

    public interface PinChangeListener {
        public void pinChanged();
    }
    
    public CreditCard {
        public PinChangeListener pinChangeListener;
    
        private int pin;
    
        public changePin(int pin) {
            this.pin = pin;
            if (pinChangeListener != null) {
                pinChangeListener.pinChanged();
            }
        }
    }
    

    要将回调/侦听器连接到信用卡,只需实现PinchangeStener方法:

    creditCard.pinChangeListener = new PinChangeListener() {
        public void pinChanged() {
            System.out.println("The pin has been changed");
        }
    };