2016-12-02 126 views
0

我在java中遇到了一个static变量的问题。Java静态接口变量

我在做一个在线游戏,我提供了两种与服务器通信的方法。

对于每种通信方式,我创建了一个不同的类,它们都实现相同的接口。在应用程序启动后,用户可以选择通信机制。

为了使这项工作,我创建了一个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

听起来像一个国家设计模式的标准用例 – jay

+0

我有一个类似于我的一个类(主)中声明的东西: 公共静态连接器连接器; 然后我有这样的事情: 情况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”static – tommy

+0

我不确定完全理解你。您可以创建一个将CompresionContext作为实例变量的抽象类,使该类实现原始接口,该接口持有静态变量(不再是),然后在每个实现原始接口的类中扩展此抽象类。 – Rubasace

+0

@tommy如果您认为这不能解决您的问题,请提供代码,以便我们为您提供适合您代码的正确解决方案。 – Rubasace

0

因为用户可以选择的通信机制,你需要使用enum这是正确的选择,看here。因此,您可以在enum类型中定义所有通信模式,并提示用户选择一种。例如像

public enum Communication { 
    CHOICE1, CHOICE2 
} 
+0

我不明白这是如何解决接口中的静态字段的问题 – Rubasace

+0

OP表示他在接口中使用了一个CONSTANT('static')**全局变量**,需要用一个更好的解决方案替换它,所以提出了一个enum用一个'enum'替换常量 – developer

+0

谢谢,但是每次我想调用通信对象的方法时,我都必须检查选择了哪一个。 – tommy