2017-07-06 7 views
0

リモートAPIからJSONデータを取得しています。このため私はObserverパターンを使用しています。私はコールバックメソッドからJSONデータを取得するWordTranslationObserverというオブザーバを作成しました。問題は、メインクラスでこのデータを取得する方法がわからないことです。Observerパターンを使用してMainクラスのデータを取得する

私のメインクラスでは、PropertyChangeListenerを実装できず、translationModel.addChangeListener(this)を使用することができません。静的コンテキストなので、 "this"は動作しません。

メインクラスのtranslation.getText()から自分のデータを取得する適切な方法は何ですか?

メインクラス

public class Main { 
    public static void main(String[] args) throws IOException { 

     WordTranslation wordTranslation = new WordTranslation(); 
     WordTranslationObserver myObserver = new WordTranslationObserver(wordTranslation); 
     wordTranslation.translate("sắt", "vie", "eng");  

    } 
} 

オブザーバー

public class WordTranslationObserver implements PropertyChangeListener { 
    public WordTranslationObserver(WordTranslation translationModel) { 
     translationModel.addChangeListener(this); 
    } 

    @Override 
    public void propertyChange(PropertyChangeEvent event) { 
     System.out.println("Changed property: " + event.getPropertyName()); 
     ArrayList<Translation> translations = (ArrayList<Translation>) event.getNewValue(); 

     // Print recieved data from JSON to the console 
     // I want to be able to get translation.getText() in my Main class 
     for (Translation translation : translations) { 
      System.out.println(translation.getText()); 
     } 
    } 
} 

データ

public class WordTranslation { 
    public static final String TRANSLATIONS = "translations"; 
    private static final String BASE_URL = "http://deu.hablaa.com/hs/translation/"; 
    private List<PropertyChangeListener> listener = new ArrayList<PropertyChangeListener>(); 
    ArrayList<Translation> translations;  

    public void addChangeListener(PropertyChangeListener newListener) { 
      listener.add(newListener); 
    } 


    public void notifyListeners(String property, Translation[] translationArray) { 
      translations = new ArrayList<>(); 
      // TODO Auto-generated method stub 
      for (Translation t : translationArray) { 
       translations.add(t); 
      } 
      for (PropertyChangeListener name : listener) { 
       name.propertyChange(new PropertyChangeEvent(this, "translations", null, translations)); 
     } 
    } 

    public void translate(String word, String from, String to) { 
      final Translation[][] translations = new Translation[1][1]; 

      String url = String.format("%s%s/%s-%s",BASE_URL, word, from, to);// args) "http://xxx"; 
     System.out.println(url); 
     final Gson gson = new Gson(); 

     // should be a singleton 
     OkHttpClient client = new OkHttpClient(); 

     Request request = new Request.Builder() 
          .url(url) 
          .build(); 


     client.newCall(request).enqueue(new Callback() { 
      @Override 
      public void onFailure(Call call, IOException e) { 
       e.printStackTrace(); 
      } 

      @Override 
      public void onResponse(Call call, final Response response) throws IOException { 
       if (!response.isSuccessful()) { 
        throw new IOException("Unexpected code " + response); 
       } 

       translations[0] = gson.fromJson(response.body().charStream(),Translation[].class); 
       notifyListeners(TRANSLATIONS,translations[0]); 

      } 
      }); 

     } 

} 

答えて

1

あなたはオブザーバーSEを持つことができますあなたが本当に望んでいれば静的変数は変更のためにポーリングすることができますが、これはイベント駆動型のオブザーバーパターンを使用するという原則を打ち破ります。

主なクラスでこの情報を利用できるようにする特別な理由があるかもしれませんが、必要に応じて新しい実装を追加することで、オブザーバーに処理を委託する傾向があります。

MainTranslationObserverで行ったのと同じ方法でメインクラスにPropertyChangeListenerを実装し、新しいMain()をWorldTranslationに登録させる(静的コンテキストではない) 。

HTH

+0

回答ありがとうございます。 – Laurent

関連する問題