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()
方法。在这种情况下,更好的解决方案是将该方法声明为静态。

您的第一个解决方案没有编译。看起来您正在尝试创建一个新的方法(在这种情况下,单例是最好的方法)。请在下次发布之前重新检查代码。它是一个静态块而不是构造函数。我更正了它。你的第一个解决方案没有编译。它看起来像是你在尝试创建一个(在这种情况下,单例将是最好的方法)。请在下次发布之前重新检查你的代码。它是一个静态块而不是构造函数。我改正了