2016-12-02 9 views
0

У меня проблема с переменной static в java.переменная статического интерфейса 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

Значения интерфейса CONSTANT, вы имеете в виду абстрактный класс? – developer

+0

Звучит как стандартный пример использования для шаблона государственного дизайна – jay

+0

У меня есть что-то вроде этого, объявленного в одном из моих классов (Main): public static Connector connector; А потом у меня есть что-то вроде этого: case 2: Main.connector = новый KryoConnector (hostValue); break; кейс 3: Main.connector = новый RMIConnector (hostValue); break; – 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, который предоставляет методы Connector путем делегирования.

Надеюсь, это поможет

+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 заменить константы на 'enum' – developer

+0

Спасибо, но тогда каждый раз, когда я хотел бы вызвать метод объекта связи, мне нужно было бы проверить, какой из них был выбран. – tommy

 Смежные вопросы

  • Нет связанных вопросов^_^