【问题标题】:Java static interface variableJava 静态接口变量
【发布时间】:2016-12-02 08:38:11
【问题描述】:

我在 java 中遇到了 static 变量的问题。

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

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

为了完成这项工作,我创建了接口的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。

【问题讨论】:

  • 接口值是CONSTANT,你的意思是抽象类吗?
  • 听起来像是状态设计模式的标准用例
  • 我在我的一个类(主)中声明了类似的东西:公共静态连接器连接器;然后后来我有这样的事情:案例2:Main.connector=new KryoConnector(hostValue);休息;案例 3:Main.connector=new RMIConnector(hostValue);休息;

标签: java static singleton global-variables field


【解决方案1】:

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

希望对你有帮助

【讨论】:

  • 谢谢,但这并不能完全解决我的问题,因为如果我想在许多类中使用接口的方法,我仍然需要声明我的“CompressionContext”静态
  • 我不确定完全理解你。您可以创建一个将 CompresionContext 作为实例变量保存的抽象类,使此类实现保存静态变量的原始接口(不再),然后在每个实现原始接口的类中扩展此抽象类。
  • @tommy 如果您认为这不能解决您的问题,请提供代码,以便我们为您提供适合您代码的正确解决方案。
  • 谢谢,但这不会消除静态,我想我只需要使其不是静态并将其作为变量传递给每个构造函数
  • 对不起,连接器在我的回答中保持静态,它只是一个实例变量。
【解决方案2】:

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

public enum Communication {
    CHOICE1, CHOICE2
}

【讨论】:

  • 我看不出这如何解决界面中的静态字段
  • OP 说他在接口中使用了一个 CONSTANT (static) 全局变量 需要用更好的解决方案替换,因此提出了一个枚举来替换常量带有enum
  • 谢谢,但是每次我想调用通信对象的方法时,我都必须检查选择了哪个。
猜你喜欢
  • 2014-12-15
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2016-02-07
  • 1970-01-01
相关资源
最近更新 更多