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



我有一个全局布尔变量,我用它来禁用金融交易系统中的所有交易。如果有任何未捕获的异常或各种其他情况(例如,帐户中没有钱),我将禁用交易。

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

thx .

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

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

在您的整个职业生涯中,有效使用全局变量的次数将是屈指可数的。所以,任何给定的时候,当你面临"全局还是全局"的决定时,大多数情况下(到目前为止)正确的答案都是否定的。事实上,除非您正在编写操作系统内核之类的东西,否则经验法则应该是"在任何情况下,无论何时何地,都不要使任何变量成为全局变量"。

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

@HermantMetalia提供的链接是一个很好的阅读:为什么静态变量被认为是邪恶的。

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

我会把它放在一个静态字段中。但更倾向于将其设置为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();
    }
}

不需要将对instance的引用传递给将使用this

的每个类

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

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

  1. 它应该是静态的,因为它将被的所有实例共享这门课。
  2. 它应该是静态的,因为你不想为所有的对象有一个单独的变量。

考虑到我建议你阅读一些关于静态变量使用的好资源,它们像魅力一样工作,除非你弄乱了它们。

如果你想为类创建一个变量常量,而不管创建了多少实例,那么使用static方法。但是,如果变量可能因类的不同实例的使用而改变,则使用实例变量。

*

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

*

但是您还需要能够跟踪有多少Dalmations这样你就不会超过101了。这不可能是实例变量,因为它必须独立于特定的度量。为例如,如果您还没有创建任何度量,那么这个变量已经创建了能够存储零。对象之前只存在静态变量创建。这就是静态变量的作用——适用的数据到超出特定实例范围的事物类。

最新更新