我在使用这个 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/