2013-03-15 97 views
1

想要在靜態主要使用非靜態方法,但我不能。我知道這個問題,但是,因爲我使用INotificationObserver,我不能使registerObserver靜態。所以我可以解決我的問題。如何在靜態主要使用非靜態方法(觀察者方法)

我該如何解決這個問題?謝謝 。

非靜態變量這不能從靜態上下文

測試

public class PushTest implements INotificationObserver{  
    NotificationService ns = NotificationService.getInstance(); 

    public static void main(String[] args) {   
     try {       
      ns.registerObserver(this); // How can i register ??? 

接口

public interface INotificationSubject { 
    public void registerObserver(INotificationObserver o); 
    public void removeObserver(INotificationObserver o); 
    public void notifyObserver(PushedNotification notification); 
} 

* NotificationService *

中引用
public class NotificationService implements INotificationSubject{ 

    protected static final Logger logger = Logger.getLogger(NotificationService.class); 
    private volatile static NotificationService uniqueFactory; 
     private ArrayList observers; 

    private NotificationService() { 
     observers = new ArrayList(); 
    } 
    public static NotificationService getInstance() { 
     if (uniqueFactory == null) { 
      synchronized (NotificationService.class) { 
       if (uniqueFactory == null) { 
        uniqueFactory = new NotificationService(); 
       } 
      } 
     } 
     return uniqueFactory; 
    } 

    public static INotification GetNotificationObject(DeviceTypes Types) { 
     INotification messageSender = null; 

     if (Types == Types.IOS) { 
      messageSender = new IosNotification(); 
     } 

     return messageSender; 
    } 

    public void registerObserver(INotificationObserver o) { 
     observers.add(o); 
    } 

    public void removeObserver(INotificationObserver o) { 
     int i = 
       observers.indexOf(o); 
     if (i >= 0) { 
      observers.remove(i); 
     } 
    } 

    public void notifyObserver(PushedNotification notification) { 
     for (int i = 0; i < observers.size(); i++) { 
      INotificationObserver observer = (INotificationObserver) observers.get(i); 
      observer.update(notification); 
     } 
    } 

    public void messageSendInfo(PushedNotification notification) { 
     notifyObserver(notification); 
    } 

    public void showSentInfo(PushedNotification notification) { 
     messageSendInfo(notification); 
    } 
} 
+2

在主方法中創建實例,而不是在外部創建。靜態方法與類關聯,無法訪問類的實例的非靜態變量。 – 2013-03-15 12:51:50

回答

2

你需要一個實例:

INotificationObserver ino = new PushTest(); 
ns.registerObserver(ino); 

爲此,要不要需要ns屬性。

+0

謝謝@jlordo它的工作!但爲什麼 ?你能解釋一下,還是你可以建議一篇文章去理解? – Talha 2013-03-15 12:50:51

+1

'main'是一個'static'方法,它屬於類,而不屬於那個類的實例。 'this'指向當前實例,所以它只能用於實例方法。 – jlordo 2013-03-15 12:52:04

0

這是主要的方法來初始化類典型的解決方案:

public class PushTest implements INotificationObserver{ 
    NotificationService ns = NotificationService.getInstance(); 

    public static void main(String[] args) {   
     PushTest pushTest = new Pushtest(); 
     ... 

等等等等