Java 静态最终成员变量与get方法
我有一个包含属性文件中所有配置的类 我的第一个解决方案是:Java 静态最终成员变量与get方法,java,static,final,Java,Static,Final,我有一个包含属性文件中所有配置的类 我的第一个解决方案是: public class Config { public static final int disc; static { // Read property file and set properties disc = 5; } } 以这种方式阅读信息: System.out.println(Config.disc); 第二个解决方案是: public class Con
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());
最好的方法是什么?为什么?优点和缺点是什么?使用getDisc()
每个对象可以有一个disc变量,而静态disc
在所有实例中共享
- 如果类的每个实例都有不同的
值,则 走第二条路disc
- 如果您有需要在类的所有实例中共享的相同值,那么使用第一种方法
System.out.println(Config.getDisc())代码>。您不能使用类名调用非静态方法,而使用getDisc()
在所有实例中共享静态disc
时,每个对象可以有一个disc变量
- 如果类的每个实例都有不同的
disc
值,则
走第二条路
- 如果您有需要在类的所有实例中共享的相同值,那么使用第一种方法
顺便说一下,您不能执行System.out.println(Config.getDisc())代码>。您不能使用类名调用非静态方法:publicstaticfinalintdisc=5代码>
然后,您可以使用Config.DISC
访问您的配置值。关于:public static final int DISC=5代码>
System.out.println(Config.getDisc());
然后可以使用Config.DISC
访问配置值
System.out.println(Config.getDisc());
这是错误的。不能用类名调用非静态方法。必须按以下方式创建对象:
Config cfg = new Config();
System.out.println(cfg.getDisc());
现在,在第一种情况下,所有实例将共享相同的光盘副本。所以,如果它不是一个常数,那么选择第二种情况
这是错误的。不能用类名调用非静态方法。必须按以下方式创建对象:
Config cfg = new Config();
System.out.println(cfg.getDisc());
现在,在第一种情况下,所有实例将共享相同的光盘副本。因此,如果它不是常数,请选择第二种情况。答案取决于disc
的含义:
- 如果
disc
表示一个常量,本质上是给一个数值命名,那么使用公共final字段更好
- 如果
disc
表示可能因用户操作而改变的值(即,如果它是配置的一部分),则最好使用带有getter的私有变量
如果您决定将来重构类,第二种方法将为您提供更大的灵活性:它允许您稍后初始化私有光盘
,或者用其他获取值的方法(例如,通过从其他值计算)替换它,或者从另一个对象读取。答案取决于光盘的含义:
- 如果
disc
表示一个常量,本质上是给一个数值命名,那么使用公共final字段更好
- 如果
disc
表示可能因用户操作而改变的值(即,如果它是配置的一部分),则最好使用带有getter的私有变量
如果您决定将来重构类,第二种方法将为您提供更大的灵活性:它允许您稍后初始化私有光盘
,或者用其他获取值的方法(例如,通过从其他值计算)替换它,或者从另一个对象读取。在这种情况下,您想要的是
public static final int DISC = 5;
System.out.println(Config.DISC);
(注意,像这样的成员通常都用大写字母书写)
您的第一个解决方案中有一个错误。它无法编译,因为您多次尝试设置最终字段。每次创建new Config()
,都会为光盘
分配一个值,但由于它是最终的,所以不起作用。您可能想建议将其放入静态构造函数中:
public class Config
{
public static final int DISC;
static
{
DISC = 5;
}
}
然而,我不推荐它,因为我发现用我写的第一种方法来做它是完全可行的,而且也容易得多
您的第二个解决方案中有一个错误。它不会编译,因为您无法从静态上下文访问非静态方法。这意味着您必须先创建一个Config实例,然后才能调用getDisc()
方法。在这种情况下,更好的解决方案是将方法声明为静态。在这种情况下,您需要的是
public static final int DISC = 5;
System.out.println(Config.DISC);
(注意,像这样的成员通常都用大写字母书写)
您的第一个解决方案中有一个错误。它无法编译,因为您多次尝试设置最终字段。每次创建new Config()
,都会为光盘
分配一个值,但由于它是最终的,所以不起作用。您可能想建议将其放入静态构造函数中:
public class Config
{
public static final int DISC;
static
{
DISC = 5;
}
}
然而,我不推荐它,因为我发现用我写的第一种方法来做它是完全可行的,而且也容易得多
您的第二个解决方案中有一个错误。它不会编译,因为您无法从静态上下文访问非静态方法。这意味着您必须先创建一个Config实例,然后才能调用getDisc()
方法。在这种情况下,更好的解决方案是将该方法声明为静态。您的第一个解决方案没有编译。看起来您正在尝试创建一个新的方法(在这种情况下,单例是最好的方法)。请在下次发布之前重新检查代码。它是一个静态块而不是构造函数。我更正了它。你的第一个解决方案没有编译。它看起来像是你在尝试创建一个(在这种情况下,单例将是最好的方法)。请在下次发布之前重新检查你的代码。它是一个静态块而不是构造函数。我改正了