2017-12-06 15 views
0

ないでので、私はクラスのコンストラクタがあります。私のクラスenclossingクラス

public class HealthDataStore { // this class is 3rd party api - can't modify 
    public HealthDataStore(Context context, HealthDataStore.ConnectionListener listener){ /* bla... */ } 

    /* bla... */ 

    // with Listener Interface: 
    public interface ConnectionListener { 
     void onConnected(); 
     void onConnectionFailed(HealthConnectionErrorResult var1); 
     void onDisconnected(); 
    } 
} 

と私は私のリポジトリクラス:

public class HealthRepository { 
    private string DSConnectionStatus; 

    public void connectDataStore(HealthDSConnectionListener listener) { 
     mStore = new HealthDataStore(app, listener); 
     mStore.connectService(); 
    } 

    // with inner class: 
    public class HealthDSConnectionListener implements HealthDataStore.ConnectionListener{ 
     @Override public void onConnected() { DSConnectionStatus = "Connected"; } 

     @Override public void onConnectionFailed(HealthConnectionErrorResult healthConnectionErrorResult) { DSConnectionStatus = "Connection Failed"; } 

     @Override public void onDisconnected() { DSConnectionStatus = "Disconnected"; } 
    }; 
} 

と私の見解モデルクラスで私は、オブジェクトの下にあります

public class SplashViewModel extends AndroidViewModel { 

    public void connectRepoDataStore(){ 
     // repo is object of class HealthRepository 
     repo.connectDataStore(mConnectionListener) 
     // other things to do here 
    } 

    private final HealthRepository.HealthDSConnectionListener mConnectionListener = new HealthRepository.HealthDSConnectionListener(){ 
     @Override public void onConnected() { 
      super.onConnected(); // i need this super to set DSConnectionStatus value 
      // other things to do here 
     } 

     @Override public void onConnectionFailed(HealthConnectionErrorResult error) { 
      super.onConnectionFailed(error); // i need this super to set DSConnectionStatus value 
      // other things to do here 
     } 

     @Override public void onDisconnected() { 
      super.onDisconnected(); // i need this super to set DSConnectionStatus value 
      // other things to do here 
     } 
    } 

private final HealthRepository.HealthDSConnectionListener mConnectionListener = new HealthRepository.HealthDSConnectionListener()なぜクラスがクラスを囲んでいないのですか?

これをどのように達成する必要がありますか?最後のリスナークラスにDSConnectionStatusをhealthrepositoryクラスに設定する機能がありますか?

答えて

1

拡張する必要があることがわかっている場合は、常に内部クラスを使用しないようにしてください。代わりに、別のクラスを使用し、外部クラスをフィールドにスワップします。公開したくないプライベートフィールドを変更する必要がある場合は、パッケージプライベートセッターを作成します。

public class HealthRepository { 
    private String DSConnectionStatus; 

    public void connectDataStore(HealthDSConnectionListener listener) { 
     mStore = new HealthDataStore(app, listener); 
     mStore.connectService(); 
    } 

    void setConnectionStatus(String status) { 
     DSConnectionStatus = status; 
    } 
} 
// create another class in the same package 
public class HealthDSConnectionListener implements HealthDataStore.ConnectionListener { 
    private final HealthRepository repo; 

    public HealthDSConnectionListener(HealthRepository repo) { 
     this.repo = repo; 
    } 

    @Override public void onConnected() { repo.setConnectionStatus("Connected"); } 
    @Override public void onDisconnected() { repo.setConnectionStatus("Disconnected"); } 

    @Override public void onConnectionFailed(HealthConnectionErrorResult error) { 
     repo.setConnectionStatus("Connection Failed"); 
    } 
}; 
public class SplashViewModel extends AndroidViewModel { 
    private final HealthRepository repo; 

    public void connectRepoDataStore() { 
     // repo is object of class HealthRepository 
     repo.connectDataStore(mConnectionListener) 
     // other things to do here 
    } 

    private final HealthDSConnectionListener mConnectionListener = new HealthDSConnectionListener(repo) { 
     @Override public void onConnected() { 
      super.onConnected(); 
      // ... 
     } 

     @Override public void onConnectionFailed(HealthConnectionErrorResult error) { 
      super.onConnectionFailed(error); 
      // ... 
     } 

     @Override public void onDisconnected() { 
      super.onDisconnected(); 
      // ... 
     } 
    } 
} 
+0

ありがとう、私は最初に試してみましょう - それがうまくいきたい! :) – AnD

0

public static class HealthDSConnectionListenerとしてあなたの内部クラスHealthDSConnectionListenerクラスを宣言して、あなたは内部クラスがstatic作り、もちろん

private final HealthRepository.HealthDSConnectionListener mConnectionListener = new HealthRepository.HealthDSConnectionListener(); 

を呼び出すことによって、それのインスタンスを作ることができますその欠点もある。あなたがstatic classルートを避けたいのであれば、次のように呼び出すことができます。

private final HealthRepository.HealthDSConnectionListener mConnectionListener = new HealthRepository().new HealthDSConnectionListener(); 

この動作の詳細については、thisを参照してください。

+0

返信ありがとう、忘れてしまった、私は実際に静的なクラスとして問題を解決しようとしている静的なクラス、静的なクラス私はアクセス/変更を許可しません: '' HealthRepository'の 'DSConnectionStatus'クラス – AnD

+0

はい、それは内部クラスを静的にする問題です。内部クラスを静的にする場合、外部プロパティも静的として宣言する必要があります。したがって、 'DSConnectionStatus'を静的にすると' HealthDSConnectionListener'内部静的クラスから変更できます。静的なルートを完全に避けたい場合は、私が言及した別のソリューションを試してみてください。 – fluffyBatman

関連する問題