2016-08-09 40 views
0

我想實現一個觀察者模式在Java上。 它不會編譯,因爲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

在接口和實現類中都將notifyAll()重命名爲noitifyObservers()。 –

回答

3

默認情況下,所有類延長Object類有一個名爲notifyAll()一個final方法。由於該方法爲final,因此不能在班級中重寫。

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

不能覆蓋Object類的notifyAll()方法,因爲它是最後的。在Subject接口和realDonaldTrump類中重命名該方法。

1

其實,這裏有兩個問題:

  1. 你應該做的編譯器消息的一些研究。你看,java編譯器的錯誤是真的不錯;大多數時候他們都會告訴你到底發生了什麼。你不應該依靠其他人向你解釋他們;最壞的情況 - 只需搜索錯誤消息文本。大多數時候,這會給你所有你需要的。
  2. 你不應該假設某個名字的方法做這個或那個。換句話說:你把@Override放在notifyAll();所以應該清楚你是重寫的一些方法。事情是:你應該明白什麼方法應該這樣做,你覆蓋。如果你不明白什麼覆蓋是;你也許也想研究這個概念。

長話短說:藉此機會退一步;例如:閱讀什麼notify()和notifyAll()應該用於。爲了理解「正確」的方式將簡單地將您的方法notifyAll()重命名爲例如「notifyAllObservers()」並刪除@Override註釋。

相關問題