Статическая и Экземпляр для Глобальной переменной состояния - PullRequest
1 голос
/ 30 декабря 2011

У меня есть глобальная логическая переменная, которую я использую, чтобы отключить всю торговлю в моей финансовой торговой системе. Я отключаю торговлю, если есть какое-либо необученное исключение или ряд других условий (например, нет денег на счете).

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

Thxs.

Ответы [ 6 ]

4 голосов
/ 30 декабря 2011

Если это экземпляр, то вы, вероятно, захотите, чтобы он был Singleton, и вы предоставите общедоступный статический геттер (или фабрику, или DI, если вам нужно тестирование).

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

2 голосов
/ 30 декабря 2011

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

Примечаниечто обертывание доступа к глобальной переменной в глобальном (статическом) методе просто обманывает себя: это все еще просто глобальная переменная.Глобальные методы хороши только в том случае, если они не сохраняют состояние .

Ссылка, предоставленная @HermantMetalia, хорошо читается: Почему статические переменные считаются злыми.

В вашем случае вам, вероятно, нужен какой-то объект «Менеджер», ссылку на который вы передаете в качестве параметра времени построения всем вашим основным логическим объектам, который, помимо прочего, содержит свойство с именем «isTradingAllowed»"или что-то в этом роде, чтобы любой, кто интересуется этой информацией, мог ее запросить.

1 голос
/ 30 декабря 2011

Я бы положил это в статическое поле. Но предпочитаю сделать его AtomicBoolean для предотвращения проблем с потоками: -)

public class TradeMaster {
    private static final AtomicBoolean TRADING_ALLOWED = new AtomicBoolean(true);

    public static void stopTrading() {
       TRADING_ALLOWED.set(false);
    }

    public static boolean isTradingAllowed() {
       return TRADING_ALLOWED.get();
    }
}
0 голосов
/ 03 января 2012

Статические плюсы: нет необходимости передавать ссылки на экземпляры каждому классу, который будет использовать этот

Статические минусы: может привести к трудностям при тестировании - я думаю, что довольно просто протестировать статическую переменную, еслиВы устанавливаете состояние переменной до и после теста (при условии, что тесты не выполняются одновременно).

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

0 голосов
/ 30 декабря 2011

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

* ** 1003 тысяча два * Пример

*

Вот пример, который может прояснить ситуацию. Представь что ты создаем игру по мотивам фильма 101 Dalmations. Как часть этого проект, вы создаете класс Dalmation для обработки анимации различных Dalmations. Классу потребуются переменные экземпляра (нестатические) для отслеживать данные, которые являются специфическими для каждого Dalmation: как его имя сколько у него пятен и т. д.

*

Но вы также должны иметь возможность отслеживать, сколько Dalmations имеют был создан, чтобы вы не прошли 101. Это не может быть примером переменная, потому что она должна быть независимой от конкретных далмаций. За Например, если вы не создали Dalmations, то эта переменная имеет чтобы иметь возможность хранить ноль. Перед объектами существуют только статические переменные созданы. Вот для чего нужны статические переменные - данные, которые применяются к чему-то, что выходит за рамки конкретного экземпляра класс.

0 голосов
/ 30 декабря 2011
  1. Он должен быть статическим, поскольку он будет использоваться всеми экземплярами этот класс.
  2. Он должен быть статическим, поскольку вы не хотите иметь отдельную переменную для всех объектов.

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

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