2016-12-02 8 views
0

Javaの変数staticに問題があります。Java静的インタフェース変数

私はオンラインゲームを作っており、サーバーとの2つの通信方法を提供しました。

コミュニケーションのそれぞれについて、私は別のクラスを作成しましたが、どちらも同じインターフェイスを実装しています。アプリケーションの起動後、ユーザは通信機構を選択することができる。

この作業を行うには、インターフェイスの変数staticを作成し、ユーザーが通信方法を選択した後に値を割り当てましたが、staticフィールドを避けたいのですが、これを行う最善の方法は何ですか?ここで

はコードです:

私はそれがメインクラスでは、ユーザが選択したものに応じて

public class Main extends Application { 
    public static Connector connector; 
} 

以降を宣言している:

private void connectWithServer() 
{ 
    String hostValue = serverTextField.getText(); 
    switch (serverComboBox.getSelectionModel().getSelectedIndex()) 
    { 
     case 0: 
      Main.connector=new KryoConnector("127.0.0.1"); 
      break; 
     case 1: 
      Main.connector=new RMIConnector("127.0.0.1"); 
      break; 
     case 2: 
      Main.connector=new KryoConnector(hostValue); 
      break; 
     case 3: 
      Main.connector=new RMIConnector(hostValue); 
      break; 
    } 
} 

後、私はこのようなメソッドを呼び出します:

Main.connector.createBoard(this); 

私は答えて見て、私はこのような何かについて考えた:

public enum ConnectionContext { 
    INSTANCE; 
    private Connector connector; 
    public void setConnector(Connector connector) 
    { 
     this.connector=connector; 
    } 
    public Connector getConnector() 
    { 
     return connector; 
    } 
} 

そして、私はこのようにそのメソッドを呼び出します:私は、静的を避けることができ、この方法で

ConnectionContext.INSTANCE.getConnector().someMethod(); 

を、とにかくそこにありますそれをより短い方法で参照することはできますか?以前はMain.connectorだけだったので。

+0

インターフェイスの値は、常に抽象クラスですか? – developer

+0

Stateデザインパターンの標準ユースケースのように聞こえます – jay

+0

私のクラス(Main)で宣言されているようなものがあります: public static Connector connector; そして、後で私はこのようなものを持っています: ケース2: Main.connector = new KryoConnector(hostValue); 休憩。 ケース3: Main.connector = new RMIConnector(hostValue); 休憩。 – tommy

答えて

0

は、私はあなたが(ConnectionContext.INSTANCE.getConnectorを()低い結合ソリューションを実現するために、あなたのコードにいくつかのデザインを追加する必要があると思うと同様のsomeMethod();。間違いなく行く方法ではありません)。

私が示唆しているのは、単にメソッドの委譲を使用していることです。このような何か:アプリケーションがそのことについては全く気にしないようにすることで

public enum ConnectionContext { 

    INSTANCE; 

    private Connector connector; 

    public void setConnectionMode(Connector connector){ 
      this.connector=connector; 
    } 

    //Method Delegation 
    public Double someMethod() { 
     return this.connector.someMethod(); 
    } 
} 

、あなたは、接続へのすべてのアクセスをカプセル化しています。コネクターメソッドを委譲によって公開することで、ConnectionContextクラスを扱う外部メソッドに焦点を合わせるだけです。

希望します。

+0

ありがとうございますが、これは私の問題を完全に解決するものではありません。なぜなら、多くのクラスのインターフェースのメソッドを使いたいのであれば、私はまだ "CompressionContext"という静的宣言をしなければならないからです。 – tommy

+0

私はあなたを完全に理解できません。 CompresionContextをインスタンス変数として保持する抽象クラスを作成し、静的変数を保持していた元のインターフェイスをこのクラスに実装し、元のインターフェイスを実装しているすべてのクラスでこの抽象クラスを拡張することができます。 – Rubasace

+0

@tommyこれで問題が解決しないと思われる場合は、コードを入力して、コードに合った適切なソリューションを提供してください。 – Rubasace

0

ユーザは通信メカニズムを選択できるので、適切な選択であるenumを使用する必要があります。hereを参照してください。したがって、すべての通信モードをenumタイプで定義し、ユーザに選択させることができます。例えば、

public enum Communication { 
    CHOICE1, CHOICE2 
} 
+0

これはインターフェイスの静的フィールドをどのように解決するかわかりません – Rubasace

+0

OPは、より良い解決策に置き換える必要があるインターフェイスでCONSTANT( 'static')**グローバル変数**を使用していると言います。列挙型の定数をenumに置き換えてください – developer

+0

ありがとうございます。しかし、通信オブジェクトのメソッドを呼び出すたびに、どのオブジェクトが選択されたかを確認する必要があります。 – tommy