java - 迭代方法

标签 java arrays object-oriented-analysis

我在使用这个 for 循环时遇到了一些问题。我不确定我是否正确设置了此方法。

这是它要求我做的事情

迭代订阅者数组中的所有元素。您应该使用更简单的版本 for 循环来执行此操作。在循环内部:如果元素不等于null,则调用 该订阅者上的 notify 方法。当你调用该方法时,你需要给它一个 Message 参数:使用与此方法相同的Message。 请注意,这里您位于 notify 方法内,并且正在调用 notify 方法 再次。但是,这不是递归,因为您调用的通知方法位于 完全不同的 ISubscriber 实例。

package message;

public class Broadcaster implements IPublisher, ISubscriber {
    private Object [] members;
    private int i = 0;

    Broadcaster(int a) {
        a = 4;
        Object[] array = new Object[a];  
        members = array;    
    }

    @Override
    public void subscribe(ISubscriber subscriber) {
        members[i] = subscriber;       
        i++;   
    }

    @Override
    public void unsubscribe(ISubscriber subscriber) {
    }

    @Override
    public void notify(Message msg) {
    }
}

最佳答案

通常您不会使用数组,而是使用动态的数组。例如一个链表

import java.util.LinkedList;
public class Broadcaster
{
    LinkedList<ISubscriber> subscribers = new LinkedList<ISubscriber>();

    public void subscribe(ISubscriber addMe)
    {
        if(addMe!= null)
        {
            if(! subscribers.contains(addMe))
            {
                this.subscribers.add(addMe);
            }
        }
    }

    public void unsubscribe(ISubscriber removeMe)
    {
        if(removeMe!= null)
        {
            this.subscribers.remove(removeMe);
        }
    }

    public void notifySubscribers() //this is called notify in your code
    {
        for(ISubscriber current : subscribers)
        {
            if(current != null)
            {
                current.beNotified(new Message());
            }
        }
    }
}

interface ISubscriber
{

    void beNotified(Message msg);    //also called notify for you; if possible avoid
}



如果您被迫使用数组,您会得到如下所示的结果:

public class Broadcaster
{
    int maxsubscribers = 4;
    ISubscriber[] subscribers = new ISubscriber[maxsubscribers];

    public void subscribe(ISubscriber addMe)
    {
        if(addMe != null)
        {
            for(int i = 0; i <maxsubscribers;i++)
            {
                if(subscribers[i] != null)
                {
                    if(subscribers[i].equals(addMe))
                    {
                        return; //already in array; not adding 
                    }
                }
            }

            for(int i = 0; i <maxsubscribers;i++)
            {
                if(subscribers[i] == null)
                {
                    subscribers[i] = addMe;
                }
            }
        }
    }

    public void unsubscribe(ISubscriber removeMe)
    {
        if(removeMe != null)
        {
            for(int i = 0; i <maxsubscribers;i++)
            {
                if(subscribers[i].equals(removeMe))
                {
                    subscribers[i] = null;
                }
            }
        }
    }

    public void notifySubscribers() //this is called notify in your code
    {
        for(ISubscriber current : subscribers)
        {
            if(current != null)
            {
                current.beNotified(new Message());
            }
        }
    }
}

使用数组的缺点是,您要么只能存储一定数量的元素,要么在用完可用槽时必须立即更改数组的大小。

正如您所看到的,避免订阅者被两次添加到数组中也有点困难。它需要一个附加循环来检查这一点,而 LinkedList 为这种检查提供了一种方便的方法。

最后但并非最不重要的一点:虽然 notify()notify(Message msg) 方法可以执行完全不同的操作,但这并不好多练习,因为它很容易导致功能混淆。

关于java - 迭代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26832759/

相关文章:

python - 没有行为的对象

java - grizzly + jersey + websocket - 不接受连接

Java:消除关于导致连接重置的原因的困惑

java - 用于 Java、Ruby、Python 的 HTML Agility Pack 或 HTML Screen Scraping 库?

javascript - Firebase - 使用回调在数组中检索和存储数据

C 数组分配过程 - 一次或单独 - 部分数组分配 - 不同的输出

java - 定期更改 JButton 文本

php - 将数组分配给静态函数变量php

javascript - 面向对象的 JavaScript : the patterns for private/public

java - 仅通过引用对象来获取值