说我压倒最后的方法,但我找不到最终的方法

时间:2016-08-09 07:37:49

标签: java design-patterns observer-pattern

我正在尝试在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();

    }

}

4 个答案:

答案 0 :(得分:3)

默认情况下,所有类扩展 Object类,其中final方法名为notifyAll()。由于该方法为final,因此无法在您的课程中覆盖该方法。

 public final native void notifyAll(); // in Object class

答案 1 :(得分:1)

您无法覆盖notifyAll()类的Object方法,因为它是最终版。在Subject界面和realDonaldTrump类中重命名该方法。

答案 2 :(得分:1)

实际上,有两个问题:

  1. 您应该对编译器消息进行一些研究。你看,java编译器错误真的好;大部分时间他们都会告诉你到底发生了什么。你不应该依赖其他人向你解释;最坏的情况 - 只搜索错误消息文本。大部分时间,这将为您提供所需的一切。
  2. 您不应该假设某个名称的方法执行此操作。换句话说:你把@Override放在notifyAll();所以应该清楚你是覆盖某种方法。事情是:你应该理解你覆盖的方法应该做什么。如果你不明白覆盖是什么;你也许也想研究这个概念。
  3. 长话短说:抓住机会退后一步;例如:读取应该使用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()