Можно ли манипулировать статическими атрибутами во время выполнения? - PullRequest
0 голосов
/ 17 декабря 2010

Я предоставляю настройки моего проекта JAVA в классе Prefs.java со статическими атрибутами и статическими методами. Но токен для OAuth2 должен быть назначен во время выполнения. Это хороший путь ...?

public class Prefs {


  //known before runtime
  public static final String SERVER_BASE_URL ="http://api.mycompany.com/";

  //needs to be set on startup through the setter method
  private static String token;


  public static String getToken() {
    return token;
  }

  public static void setToken( String token ) {
    Prefs.token = token;
  }

  public static String getXyEndpointUrl() {
    return SERVER_BASE_URL + "/xy";

  }
}

Ответы [ 3 ]

3 голосов
/ 17 декабря 2010

Я бы посоветовал против такого дизайна. Этот тип статических переменных не лучше глобальных переменных. Эта страница дает несколько причин, по которым вам следует избегать их. Вот несколько из них.

  • Нелокальность
  • Нет контроля доступа или проверки ограничений
  • неявная связь
  • Проблемы параллелизма
  • Тестирование и заключение

Но токен для OAuth2 должен быть назначен во время выполнения. Это хороший путь ...?

Здесь мне действительно кажется, что вы захотите передать такой токен конструктору объекта Prefs.

1 голос
/ 17 декабря 2010

Статические переменные являются объектно-ориентированными заменителями глобальных переменных в C. Старайтесь избегать их всякий раз, когда это возможно.

Часто вам нужен только один объект, в вашем случае это объект Prefs.

public class Prefs {

  //known before runtime
  public final String SERVER_BASE_URL ="http://api.mycompany.com/";

  //needs to be set on startup through the setter method
  private String token;


  public String getToken() {
    return token;
  }

  public void setToken( String token ) {
    Prefs.token = token;
  }

  public String getXyEndpointUrl() {
    return SERVER_BASE_URL + "/xy";
  }

}

public class Program {

  protected Prefs prefs;

  protected Other prefsAware;

  public Program() {
    prefs = new Prefs();
    prefsAware = new Other(prefs);
  }

  // or even (if you don't like constructor mediated passing of prefs)
  public Prefs getPrefs() {
    return prefs;
  }

}
0 голосов
/ 17 декабря 2010

обычно глобальные конфигурации читаются из файлов свойств во время выполнения. Вы можете иметь различные конфигурационные файлы для разработки, контроля качества, производственных сред.

Единственное, о чем вам нужно по крайней мере знать, это то, что в веб-приложении, если вы устанавливаете статические переменные из веб-запроса, вы можете изменить данные, если не синхронизируете установщик. Если вы только читаете, то все будет в порядке.

Альтернатива тому, что вы делаете, - почему бы не внедрить ключ OAuth в службу, которая обрабатывает проблемы аутентификации вашей системы? Вы можете делать то, что вам нужно, со статическим ресурсом, но в этом случае, но вы должны знать, что вам действительно не нужна статическая переменная для хранения ключа.

...