Шаблон для статических переменных в стиле C в Java? - PullRequest
4 голосов
/ 31 августа 2010

Каков наилучший способ создания статической переменной в стиле C в Java (локально для метода)?

У меня есть метод, в котором мне нужно вычислить переменную только один раз, и мне не нужночтобы пересчитать его для времени жизни объекта.

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

Есть ли какие-нибудь указатели о том, как мне этого добиться?

Ответы [ 5 ]

4 голосов
/ 31 августа 2010

C ++ статические локальные переменные эквивалентны статическим полям с отложенной инициализацией.

C ++:

class Example {
 public:
  void method() {
    static Something something;
  }
};

Java:

public class Example {
    private static Something something;
    public void method() {
        if (something == null) something = new Something();
    }
}
1 голос
/ 31 августа 2010

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

Если вам нужно совместно использовать даже тогда, то ленивая статическая инициализация в для службы без сохранения состояния лучше, чем Singleton.Если кэширование / запоминание является локальным (и уместным), оно не нарушает «ментальную картину без сохранения состояния», которая помогает поддерживать чистоту кода.

Однако кеширование / запоминание - это трудная задача для тестирования.Но манипулирование bean-компонентами без сохранения состояния тривиально, и независимая проверка работы кеша также проста.

1 голос
/ 31 августа 2010

локально для метода
для времени жизни объекта

Для меня эти два предложения являются взаимоисключающими в мире Java.Вы хотите либо локальную переменную для метода, либо переменную экземпляра.Судя по тому, что ты сказал, ты хочешь последнее.Чтобы инициализировать его, вы можете использовать, как кто-то уже сказал, ленивый шаблон загрузки, который будет инициализировать его тогда и только тогда, когда вам это нужно.Недостатком будет проверка в других методах, инициализирована ли она.

Делать вещи в Java способом C - не лучшая идея imho.

0 голосов
/ 31 августа 2010

Думаю, вы имеете в виду стратегию типа «ленивый кеш».Как это:

class LazyCacheExample {

    Integer x = null;

    public Integer calculateX() {
        // if x has not been calculated yet, calculate it now
        if (null == this.x) {
            // TODO consider thread safety here... 
            this.x = 2+2; 
        }

        // otherwise return the calculated object
        return this.x;
    }   
}
0 голосов
/ 31 августа 2010

Используйте шаблон Lazy Load .

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