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

Java 带有删除和添加通知的自定义arraylist,java,android,arraylist,Java,Android,Arraylist,我想在向数组列表添加某些项或从中删除某些项时进行检测。实际上,我有如下代码: public class myClass { MyCustomArrayList<MyObject> al; public void method1() { al.add(myObject); // Do other works al.remove(myObject) // Do other works

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

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.
    }

}
公共类myClass{
MyCustomArrayList al;
公共无效方法1(){
al.add(myObject);
//做其他工作
al.移除(myObject)
//做其他工作
}
私有无效Dobyachadd(){
//我希望数组列表通过添加每个项来调用此方法。
//它应该在这门课上,因为它正在做一些工作
//与此类相关。例如,更改某些私有变量
}
私有void dobyachremove(){
//我希望数组列表通过添加每个项来调用此方法。
//它也应该在这门课上。
}
}
我知道数组列表不具备侦听器或某种通知或事件的功能,如果我想检测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
}
类MyArrayList{
私有数组列表;
公共MyList(){
列表=新的ArrayList();
...
}
公共无效添加(T){
列表。添加(t){
//在添加项目时执行其他您想执行的操作
}
公共T移除(T){
列表。删除(t);
//在删除项目时执行其他您想执行的操作
}
(我从你那里得到的)


所以问题是:如何通知
MyArrayList
al
)的对象当
remove
add
方法被激发时,调用
dobyachadd
dobyachremove
方法。有人有什么想法吗?

你需要将
myClass
访问
MyArrayList

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
}

您可能需要使用
回调
机制

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

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

  • 当发生以下情况时,具有要执行的操作的每个客户端 服务器事件发生时实现接口,从而 给出抽象方法的代码

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

  • 服务器类通过调用 该客户端的接口方法

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

    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");
        }
    };
    
    public T removeT(T t) {
        remove(t);
        // do some stuff
        return someT;
    }
    

    首先,遵循命名约定。其次,您为同一类使用的三个类名,
    MyList
    MyArrayList
    MyCustomArrayList
    会让人感到困惑。至于您的问题,您必须在
    MyArrayList
    类型的
    myClass
    中有一个实例字段(除非您想将
    dobyachadd
    dobyachremove
    重构为
    静态的
    )。这可以通过将其作为构造函数参数添加来完成,例如

    // inside MyArrayList
    private ArrayList<T> list;
    private final myClass instance;
    
    public MyArrayList(myClass instance) { // <-- NOT MyList
        list = new ArrayList();
        this.myClass = myClass;
    }
    
    如果您坚持要从
    删除
    返回
    T
    ,请声明另一种方法:

    creditCard.pinChangeListener = new PinChangeListener() {
        public void pinChanged() {
            System.out.println("The pin has been changed");
        }
    };
    
    public T removeT(T t) {
        remove(t);
        // do some stuff
        return someT;
    }