0

我有一个包含属性文件中所有配置的类。

我的第一个解决方案是:

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());

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

4

5 回答 5

2

答案取决于 的含义disc

  • 如果disc表示一个常量,本质上是给一个数值命名,比公共 final 字段更好
  • 如果disc表示一个可能会因用户操作而改变的值(即,如果它是配置的一部分),则最好使用带有 getter 的私有变量。

如果您决定将来重构您的类,第二种方法为您提供了更大的灵活性:它允许您disc稍后初始化私有,或者用其他获取值的方式替换它,例如通过从其他值计算它,或从另一个对象读取。

于 2013-09-04T10:00:23.513 回答
1

怎么样:public static final int DISC = 5; 然后你可以Config.DISC用来访问你的配置值。

于 2013-09-04T09:56:48.540 回答
1
System.out.println(Config.getDisc());

这是错误的。您不能使用类名调用非静态方法。您必须按以下方式创建对象:

Config cfg = new Config();
System.out.println(cfg.getDisc());

现在,在您的第一种情况下,所有实例都将共享相同的disc. 所以,如果它不是一个常数,请选择第二种情况。

于 2013-09-04T09:56:49.410 回答
1

使用getDisc()您可以为每个对象拥有一个磁盘变量,同时static disc在所有实例之间共享。

  • 如果您disc对类的每个实例都有不同的价值,那么请采用第二种方法。
  • 如果您具有需要在类的所有实例之间共享的相同值,则使用第一种方法

顺便说一句,你做不到System.out.println(Config.getDisc());。您不能使用类名调用非静态方法

于 2013-09-04T09:55:24.240 回答
0

在这种情况下你想要的是真的

public static final int DISC = 5;

System.out.println(Config.DISC);

(请注意,像这样的成员通常总是用大写字母书写)。


您的第一个解决方案有错误。它不会编译,因为您尝试多次设置最终字段。每次创建 时new Config(),您都会为 分配一个值disc,但由于它是最终的,因此无法正常工作。您可能想要建议的是把它放在静态构造函数中:

public class Config
{
    public static final int DISC;
    static
    {
        DISC = 5;
    }
}

但是,我不推荐它,因为完全可以按照我写的第一种方式来做,而且也更容易。

您的第二个解决方案有错误。它不会编译,因为您无法从静态上下文访问非静态方法。这意味着您首先必须创建一个 Config 实例,然后才能调用该getDisc()方法。在这种情况下,更好的解决方案是将方法声明为静态。

于 2013-09-04T10:05:11.780 回答