静态最终成员变量与get方法

时间:2013-09-04 09:52:03

标签: 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 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());

最好的方法是什么?为什么?有什么优缺点?

6 个答案:

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