Как бороться с однократным выполнением «фрагмента кода» или метода? - PullRequest
1 голос
/ 15 ноября 2011

Я часто сталкиваюсь с подобной ситуацией.

class A{
  public static boolean flag = true;

  public void method(){
    // calls method in class B
    B b = new B();
    while(someCondition){
      b.method();
    }
  }
}

.

class B{

    public void method(){
      if(A.flag){
        // Read all data from a flat file and store it in HashMAp/ArrayList etc 
        //only for the first time
        A.flag = false;
      }
      // Manipulate the data
   }
}

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

Это как обычно с этим справляются? Я чувствую себя немного глупо и неестественно, используя статические переменные и операторы if для решения проблемы.

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

Ответы [ 4 ]

3 голосов
/ 15 ноября 2011

Похоже, вам нужен Singleton Pattern .Выясните, какие данные B необходимо загрузить при первом использовании, и упакуйте их в отдельный класс, который будет использоваться в качестве одноэлементного экземпляра.См. эту ссылку для получения дополнительной информации о том, как реализовать шаблон синглтона в Java.

Следуя этому шаблону, вы можете избежать необходимости проверять флаг каждый раз, когда вызывается ваш method,и вы можете одновременно избегать проблем с многопоточностью (если они есть).

2 голосов
/ 15 ноября 2011

Как отметил Джон Б., достаточно просто проверить null вместо использования флага. Если безопасность потоков становится проблемой, вы также можете обратиться к CacheBuilder и Suppliers.memoize () от Guava для этих типов ситуаций.

1 голос
/ 15 ноября 2011

Вы можете просто проверить, инициализирован ли предыдущий вызов список / карта, в которой хранятся ваши данные

class A {

  public void method() {
    B b = new B();
    while (someCondition) {
      b.method();
    }
  }
}

class B {

  private List myList;

  public void method() {
    if (myList == null) {
      // Read all data from a flat file and store it in myList
    } 
    // manipulate the data

  }
}
1 голос
/ 15 ноября 2011

Вместо того, чтобы читать внешний флаг, чтобы определить, были ли данные уже сохранены, почему бы не проверить хранилище данных, чтобы увидеть, заполнено ли оно? Или, если хранилище данных дорогое (БД), используйте локальную статическую переменную, а не переменную другого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...