java中的static
变量有问题。
我正在制作一个在线游戏,我提供了与服务器的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之前。
我认为您需要在代码中添加一些设计才能获得低耦合解决方案(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类上,并通过委托揭示连接器方法。
希望它有帮助
因为用户可以选择通信机制,您需要使用正确的选择enum
,这是正确的选择,请在此处查看。因此,您可以在enum
类型中定义所有通信模式,并提示用户选择一种。例如,
public enum Communication {
CHOICE1, CHOICE2
}