在Java中创建程序包或程序包变量的标准方法/最佳实践是什么?
我想设置一些可由多个类访问的全局变量。这些全局变量的示例包括布尔标志testModeOn,语言设置,当前本地服务器,时间显示格式等。根据其他一些问题(即this one),没有任何全局变量,但有一些使用接口(不推荐?)或类的解决方法。由于原始海报没有解释他们的情况,他们几乎得到了阳光下的每一个答案,我想专门询问程序配置变量。
创建类/包/接口然后将其导入我的工作类/包更好吗?在尝试使用单独的类或接口实现这些变量时,我应该注意什么?有没有其他方法来捏造包级变量,因为Java本身并没有这样做?
注意:除非重新编译程序,否则这些变量可能不会改变。
答案 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
我更喜欢的是弹簧启动方式(例如依赖注入) 这里有一个代码示例,显然是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