Java 静态接口变量

Java static interface variable

java 中的 static 变量有问题。

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

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

为了使这个工作,我创建了一个 static 接口变量,并在用户选择通信方法后分配值,但我想避免 static 字段,什么是最好的方法是什么?

代码如下:

我已经在主体中声明了它 class

 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.

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

public enum Communication {
    CHOICE1, CHOICE2
}

我认为您需要在代码中添加一些设计以实现低耦合解决方案(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 class 上,它通过委托公开了连接器方法。

希望对您有所帮助