我有一个全局布尔变量,用于禁用我的金融交易系统中的所有交易。 如果有任何未被捕获的例外情况或其他各种情况(例如账户中没有资金),我会禁用交易。
此变量应该是静态的还是实例变量?如果它是一个实例,我需要将它添加到类的负载的构造函数中......不确定它是否值得麻烦。
Thxs。
答案 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)
鉴于我建议您阅读一些用于静态变量使用的好资源,除非您弄乱它们,否则它们会像魅力一样工作..
答案 5 :(得分:-1)
如果要为类创建一个常量,而不管有多少个实例被创建,那么请使用静态方法。但是如果变量可能会根据不同类的实例的使用而改变,那么使用实例变量。
示例强>
*
这是一个可能澄清情况的例子。想象一下你 正在创建一个基于电影101 Dalmations的游戏。作为其中的一部分 项目,你创建一个Dalmation类来处理各种动画 Dalmations。该类需要实例(非静态)变量 跟踪每个Dalmation特有的数据:它的名称 是,它有多少斑点等。
*
但是你还需要能够跟踪Dalmations有多少 已创建,所以你不要超过101.这不是一个实例 变量,因为它必须独立于特定的Dalmations。对于 例如,如果您尚未创建任何Dalmations,则此变量具有 能够存储零。在对象之前只存在静态变量 被创造了。这就是静态变量的用途 - 适用的数据 超出特定实例范围的东西 类。