java - 是否建议使用静态变量来维护状态?

标签 java oop design-patterns object static-methods

我有一个依赖于外部依赖项的加密实用程序方法 --- 从属性文件中检索的密码 key 。在我继承的当前代码库中检索它的方式是,它依赖于创建新对象才能获取属性文件中属性的值。例如,如果想从属性文件中获取 Cipher Key,则如下所示:

    public synchronized static String encrypt(String someTextToEncrypt) {
             String propertyValue = null;
             propertyValue = getProcessCommonBase().
                                getProcessProperties.getProperty("CIPHER_KEY");
                     /*encrypt algorithm*/
             return encryptedForm;
        } 
    private synchronized static ProcessCommonBase getProcessCommonBase() {
            if (processCommonBase == null) {
                 processCommonBase = new ProcessCommonBase();
            }
            return processCommonBase;
    }
    private static ProcessCommonBase processCommonBase;

已编辑: 从设计角度来看,使用 processCommonBase 实例变量之类的东西是一个很好的做法吗?我的理解是,一个好的做法是静态变量应该是最终的并且不改变。然而,在这种情况下,ProcessCommonBase 类维护状态并且可能会发生更改。

新问题:如果静态方法依赖于外部的东西,我不应该只将该方法和 processCommon 基本变量标记为非静态,并且在 Spring 中为其创建一个 bean 定义吗?什么是更好的?

最佳答案

我同意乔纳斯的观点。我不明白为什么不将变量设为最终变量。您能否详细说明一下这到底是什么意思:

My understanding is that a good practice is that static variables should be final and do not change. In this case, however, the ProcessCommonBase class maintains state and is subject to change.

即使变量是最终变量,您仍然可以以与使用非最终变量完全相同的方式更改它引用的对象。这就是为什么静态方法让静态变量保持其状态是完全可以的,但在这种情况下没有什么可以阻止你实际将其设为最终状态。为什么不这样做:

私有(private)静态 ProcessCommonBase processCommonBase = new ProcessCommonBase();

也许有一些东西阻止您在静态初始化时创建 processCommonBase,但从您提供的信息来看,这一点并不明显。

关于java - 是否建议使用静态变量来维护状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4426835/

相关文章:

c++ - 为什么 Gun *gun=&machinegun 有效,而 *gun=&machinegun 无效?

design-patterns - 在这种情况下,此 API 的最佳设计是什么?

actionscript-3 - 为真实世界还是适当的OOP世界建模?或两者?

vb.net - VB.NET 中的迭代器模式(C# 将使用 yield!)

java - 为什么此 Java Robot 代码会关闭我的计算机?

java - 确保 RMI 仅在一个服务器实例上运行

java - 如何在没有实例或类名的情况下获取类对象

java - 如何使用 .yaml 文件将策略添加到 AWS Lambda 函数?

c# - 将命令模式调整为建立多个 API 连接的单例

database - 将消费者定义的聚合(例如 SQL 计数)与 'pure' 模型对象结合起来?