我正在尝试在Java上实现Observer模式。
它不会编译,因为notifyAll()
似乎是问题所在;
Cannot override the final method from Object
但我没有在代码中添加任何“最终”或“静态”。
我在这里做错了什么?
import java.util.ArrayList;
import java.util.List;
interface Observer {
void update();
}
interface Subject {
void registerObserver(Observer o);
void deregisterObserver(Observer o);
void notifyAll();
}
// Concrete Class
class User implements Observer {
@Override
public void update() {
System.out.println("Donald Trump just tweeted, you know");
}
}
// Concrete Class
class realDonaldTrump implements Subject {
private boolean hasTweeted = false;
private ArrayList<Observer> followers = new ArrayList<Observer>();
public boolean hasTweetedIn24Hours() {
return hasTweeted;
}
public void donaldTweets(boolean hasTweeted) {
this.hasTweeted = hasTweeted;
notifyAll();
}
@Override
public void registerObserver(Observer o) {
followers.add(o);
}
@Override
public void deregisterObserver(Observer o) {
followers.remove(o);
}
@Override
public void notifyAll() {
for (Observer o: followers)
o.update();
}
}
public class ObserverPatternDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello World");
System.out.println("Observer Pattern Demo");
realDonaldTrump tweeterAcc = new realDonaldTrump();
}
}
答案 0 :(得分:3)
默认情况下,所有类扩展 Object
类,其中final
方法名为notifyAll()
。由于该方法为final
,因此无法在您的课程中覆盖该方法。
public final native void notifyAll(); // in Object class
答案 1 :(得分:1)
您无法覆盖notifyAll()
类的Object
方法,因为它是最终版。在Subject
界面和realDonaldTrump
类中重命名该方法。
答案 2 :(得分:1)
实际上,有两个问题:
长话短说:抓住机会退后一步;例如:读取应该使用notify()和notifyAll()。为了理解“正确”方法只是将方法notifyAll()重命名为“notifyAllObservers()”并删除@Override注释。
答案 3 :(得分:0)
将间接 extends 层次结构解析为在java.lang中对象的基础。这个方法是public void and final,所以你不能覆盖它
https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notifyAll()