Java - 创建包广泛或全局变量的最佳实践

时间:2014-06-22 11:14:24

标签: java variables global-variables

在Java中创建程序包或程序包变量的标准方法/最佳实践是什么?

我想设置一些可由多个类访问的全局变量。这些全局变量的示例包括布尔标志testModeOn,语言设置,当前本地服务器,时间显示格式等。根据其他一些问题(即this one),没有任何全局变量,但有一些使用接口(不推荐?)或类的解决方法。由于原始海报没有解释他们的情况,他们几乎得到了阳光下的每一个答案,我想专门询问程序配置变量。

创建类/包/接口然后将其导入我的工作类/包更好吗?在尝试使用单独的类或接口实现这些变量时,我应该注意什么?有没有其他方法来捏造包级变量,因为Java本身并没有这样做?

注意:除非重新编译程序,否则这些变量可能不会改变。

4 个答案:

答案 0 :(得分:4)

如果你在讨论常量,那么它们应该被声明为类中的static final个字段(根据Joshua Bloch的说法,从不在接口中)。

如果您正在讨论可以随时更改的设置,那么这些可能是类中的static个字段,或者您可以创建ConfigHandler类来管理可配置值的设置和获取。 / p>

将类字段用于可变值可能会导致并发问题,因此如果您的应用程序是多线程的,那么最好创建一个ConfigHandler类来仔细管理并发访问,并提供synchronized方法以避免出现问题。 / p>

答案 1 :(得分:2)

在我看来,将任何内容传递到类中的最佳方法是使用依赖注入。这将消除您对Singletons,静态常量等的需求。

根据您喜欢的DI,以下是您描述的问题的一些链接解决方案:

答案 2 :(得分:0)

如果需要在不同的类中使用多个变量,请创建Bean类。最佳做法是使用getter和setter创建一个私有变量。

public class ListBean implements Serializable
{
    private boolean testModeOn;
    public boolean getTestModeOn()
    { 
       return testModeOn;
    }
    public setTestModeOn(boolean testModeOn)
    {
        this.testModeOn = testModeOn;
    }

答案 3 :(得分:-1)

一般来说,有很多方法可以解决这个问题。

简单的方法是使用Singelton。 这不是一个选择 - Singelton是一个反模式。 http://c2.com/cgi/wiki?SingletonsAreEvil

那还有什么呢?具有public static final个变量的接口? 不是一个选项 - 这根本不是界面的用例:https://stackoverflow.com/a/2659740/1248724

那么还有什么呢? 答案是:

enter image description here

我更喜欢的是弹簧启动方式(例如依赖注入) 这里有一个代码示例,显然是Spring。

import org.springframework.stereotype.*
import org.springframework.beans.factory.annotation.*
@Component
public class MyBean {
 @Value("${name}")
 private String name;
 // ...
}

如果您使用的是类似的框架,那么这些内容可以轻松归档。

如果在您的环境中以某种方式不可能,我必须编写类似这样的代码:

public final class Configuration {

private Configuration() {
    // make sure there is no instance of this class
}

    public static final MySetting<DateFormat>   setting = new SampleProperty();

    public interface MySetting<T> {
        T get();
    }

    private static final class SampleProperty implements MySetting<DateFormat> {

        @Override
        public DateFormat get() {
            return new SimpleDateFormat("...");
        }

    }

    // other inner classes that implement the MySetting interface
}

public static void main(final String[] args) {
     Configuration.setting.get();
}

优点: - 您可以根据需要验证您的属性。 - 如果您愿意,可以使用java安全管理器

缺点: - 您可能必须维护一堆代码(使用lambda表达式应该更容易) - 就像春天在这里提供的方式那样不太好。

我刚发现的一种非常类似的方法:https://stackoverflow.com/a/3931399/1248724