我有一个包含属性文件中所有配置的类。
我的第一个解决方案是:
public class Config {
public static final int disc;
static {
// Read property file and set properties
disc = 5;
}
}
以这种方式阅读信息:
System.out.println(Config.disc);
第二个解决方案是:
public class Config {
private int disc;
public void Config() {
// Read property file and set properties
disc = 5;
}
public int getDisc() {
return this.disc;
}
}
以这种方式阅读:
System.out.println(new Config().getDisc());
最好的方法是什么?为什么?有什么优缺点?
答案 0 :(得分:2)
答案取决于disc
:
disc
表示常量,实际上是给数字值命名,而不是公共最终字段更好disc
表示可能因用户操作而改变的值(即,如果它是配置的一部分),那么带有getter的私有变量更可取。第二种方法为您提供了更大的灵活性,如果您决定将来重构您的类:它允许您稍后初始化私有disc
,或者用其他获取值的方式替换它,例如通过从其他值计算它,或从另一个对象读取。
答案 1 :(得分:1)
使用getDisc()
每个对象可以有一个光盘变量,而static disc
在所有实例中共享。
disc
值,那么
采取第二种方法。按照他们的方式,你不能System.out.println(Config.getDisc());
。您不能使用类名
答案 2 :(得分:1)
怎么样:public static final int DISC = 5;
然后,您可以使用Config.DISC
来访问您的配置值。
答案 3 :(得分:1)
System.out.println(Config.getDisc());
这是错误的。您不能使用类名调用非静态方法。您必须创建如下对象:
Config cfg = new Config();
System.out.println(cfg.getDisc());
现在,在您的第一种情况下,所有实例将共享disc
的相同副本。所以,如果它不是一个常数,请选择第二种情况。
答案 4 :(得分:0)
软件工程原则要求“信息隐藏”。在您的第一个解决方案中,您的“光盘”属性是公共的,此属性可以在任何地方使用,它打破了“信息隐藏”原则。我投票给你的第二个解决方案,并建议你将“光盘”私有化。
答案 5 :(得分:0)
在这种情况下你想要的是
public static final int DISC = 5;
System.out.println(Config.DISC);
(请注意,这些成员通常都是用capticals编写的。)
您的第一个解决方案中有错误。它不会编译,因为您尝试多次设置最终字段。每次创建new Config()
时,您都会为disc
分配一个值,但由于它是最终的,因此无效。您可能想要建议的是将它放在静态构造函数中:
public class Config
{
public static final int DISC;
static
{
DISC = 5;
}
}
但是,我不推荐它,因为我总是发现这是我写的第一种方式并且更容易。
您的第二个解决方案中有错误。它不会编译,因为您无法从静态上下文访问非静态方法。这意味着您首先必须创建一个Config实例,然后才能调用getDisc()
方法。在这种情况下,更好的解决方案是将方法声明为静态。