全局状态变量的静态与实例

时间:2011-12-30 10:27:47

标签: java static

我有一个全局布尔变量,用于禁用我的金融交易系统中的所有交易。 如果有任何未被捕获的例外情况或其他各种情况(例如账户中没有资金),我会禁用交易。

此变量应该是静态的还是实例变量?如果它是一个实例,我需要将它添加到类的负载的构造函数中......不确定它是否值得麻烦。

Thxs。

6 个答案:

答案 0 :(得分:4)

如果它是一个实例,那么您可能希望它是一个Singleton,并且您将提供一个公共静态getter(或者工厂,或者如果您关心测试,则提供DI)。

如果从多个线程访问它,那么在两种情况下最好都是AtomicBoolean

答案 1 :(得分:2)

在整个职业生涯中,一只手的手指可以计算出对全局变量有效使用的次数。所以,在任何特定时间你都面临着“全球化或不全球化”的决定,大多数机会(到目前为止)都是正确的答案。事实上,除非你正在编写操作系统内核等,否则经验法则应该是“在任何情况下都不要随时随地变换任何变量。”

请注意,在全局(静态)方法中包装对全局变量的访问只是在欺骗自己:它仍然只是一个全局变量。全局方法只有在无状态时才可以。

@HermantMetalia提供的链接很好读:Why are static variables considered evil.

在您的情况下,您需要的可能是某种“Manager”对象,您将其作为构造时间参数传递给所有主要逻辑对象的引用,其中包含一个名为“ isTradingAllowed“或类似的东西,以便任何对这条信息感兴趣的人都可以查询它。

答案 2 :(得分:1)

我把它放在静态字段中。但是更喜欢使它成为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();
    }
}

答案 3 :(得分:0)

静态优点: 无需将对实例的引用传递给将使用此

的每个类

静态缺点: 可能导致测试困难 - 我认为如果在测试之前和之后设置变量的状态(假设测试没有并发运行),测试静态变量应该相当容易。

结论: 我认为这里的选择取决于你对测试静态变量的看法是什么......对于一个管理状态的变量的简单情况,我真的看不到使用静态的问题。另一方面......将实例传递给依赖类的构造函数并不是那么难,所以在使用实例方法时你真的没有任何缺点。

答案 4 :(得分:-1)

  1. 它应该是静态的,因为它将由所有实例共享 这堂课。
  2. 它应该是静态的,因为你不想为所有对象都有一个单独的变量。
  3. 鉴于我建议您阅读一些用于静态变量使用的好资源,除非您弄乱它们,否则它们会像魅力一样工作..

答案 5 :(得分:-1)

如果要为类创建一个常量,而不管有多少个实例被创建,那么请使用静态方法。但是如果变量可能会根据不同类的实例的使用而改变,那么使用实例变量。

示例

*

  

这是一个可能澄清情况的例子。想象一下你   正在创建一个基于电影101 Dalmations的游戏。作为其中的一部分   项目,你创建一个Dalmation类来处理各种动画   Dalmations。该类需要实例(非静态)变量   跟踪每个Dalmation特有的数据:它的名称   是,它有多少斑点等。

*

  

但是你还需要能够跟踪Dalmations有多少   已创建,所以你不要超过101.这不是一个实例   变量,因为它必须独立于特定的Dalmations。对于   例如,如果您尚未创建任何Dalmations,则此变量具有   能够存储零。在对象之前只存在静态变量   被创造了。这就是静态变量的用途 - 适用的数据   超出特定实例范围的东西   类。