为数值定义java常量的更好方法

为数值定义java常量的更好方法,java,Java,在java中,我们可以定义常量以避免出现幻数,例如列表大小、天数。 我的问题是关于在代码中重用为数字定义的常量 方法1: 我可以定义两个值都为30的常数 public static final int ONE_MONTH=30 public static final int LIST_SIZE_THIRTY=30 方法2: 我可以定义一个值为30的常数 public static final int THIRTY=30 从java语法的角度来看,两者都是正确的。虽然方法1提供了更多信息,但必

在java中,我们可以定义常量以避免出现幻数,例如列表大小、天数。 我的问题是关于在代码中重用为数字定义的常量

方法1: 我可以定义两个值都为30的常数

public static final int ONE_MONTH=30
public static final int LIST_SIZE_THIRTY=30
方法2: 我可以定义一个值为30的常数

public static final int THIRTY=30
从java语法的角度来看,两者都是正确的。虽然方法1提供了更多信息,但必须定义两个常数。方法2只是一个用英语写的数字,可以用于我们假设使用一个月和列出三十个大小的两个地方


建议采用哪种方法以及为什么?

问题是您想要什么

你想要可读性和可重用性?拿第一个来说

你想要内存优化?采取第二种解决方案

为什么??想象一下,不管出于什么原因,明天一个月将有35天。对于第二个,你将不得不重新设计你的所有应用程序,对于第一个,你只需将30改为35


编辑:要清楚,第一个解决方案远不是最好的,毫无疑问,除非你处于一个非常。。。内存限制性开发…

问题是你想要什么

你想要可读性和可重用性?拿第一个来说

你想要内存优化?采取第二种解决方案

为什么??想象一下,不管出于什么原因,明天一个月将有35天。对于第二个,你将不得不重新设计你的所有应用程序,对于第一个,你只需将30改为35


编辑:要清楚,第一个解决方案远不是最好的,毫无疑问,除非你处于一个非常。。。内存限制开发…

如果您定义一个常量,如

public static final int LIST_SIZE_THIRTY=30
这与使用30完全相同,因为如果默认大小变为20,则不建议以类似的方式结束

public static final int LIST_SIZE_THIRTY=20
或者创建一个新常量并替换旧常量。 你的常量应该是有意义的,也就是说,它们必须帮助那些阅读和维护代码的人,即使他/她是代码作者

所以我的建议是:

public static final int ONE_MONTH=30;
public static final int DEFAULT_LIST_SIZE=30;
因为它们有不同的含义,即不同的语义。如果在您的第一个版本中,需求规定默认列表大小为一个月,您可以用

public static final int ONE_MONTH=30;
public static final int DEFAULT_LIST_SIZE=ONE_MONTH;

S.I没有考虑定义两个常量使用更多的内存,因为这是一个设计问题,一个或两个甚至更多的变量通常不会在java程序中使用内存方面产生这样的差异。

public static final int LIST_SIZE_THIRTY=30
这与使用30完全相同,因为如果默认大小变为20,则不建议以类似的方式结束

public static final int LIST_SIZE_THIRTY=20
或者创建一个新常量并替换旧常量。 你的常量应该是有意义的,也就是说,它们必须帮助那些阅读和维护代码的人,即使他/她是代码作者

所以我的建议是:

public static final int ONE_MONTH=30;
public static final int DEFAULT_LIST_SIZE=30;
因为它们有不同的含义,即不同的语义。如果在您的第一个版本中,需求规定默认列表大小为一个月,您可以用

public static final int ONE_MONTH=30;
public static final int DEFAULT_LIST_SIZE=ONE_MONTH;

S.I没有考虑定义两个常量使用更多的内存,因为这是一个设计问题,一个或两个甚至更多的变量通常不会在java程序中使用内存方面造成这样的差异。

< P>有一个替代方案,改变你的第二种方法,如下面的 维护一个常量类-

public class Constants{

public static final int NUMBER_THIRTY=30;
....
...  //rest of the class
}

然后,使用如下所示的枚举-

imprort ...Constants;
 public enum EnumConstants {

        MONTH(Constants.NUMBER_THIRTY),
             LIST_SIZE_THIRTY(Constants.NUMBER_THIRTY);

        int value;

    private EnumConstants(int value) {
        this.value = value;
    }

    public int value() {
        return value;

    }

}

因此,通过这种方式,您可以实现代码重用性、代码可读性和可维护性。将来,如一个答案中所述,如果月份的值发生变化,那么您只需要在Constants类中更改值。

有一种替代方法,更改第二种方法,如下所示- 维护一个常量类-

public class Constants{

public static final int NUMBER_THIRTY=30;
....
...  //rest of the class
}

然后,使用如下所示的枚举-

imprort ...Constants;
 public enum EnumConstants {

        MONTH(Constants.NUMBER_THIRTY),
             LIST_SIZE_THIRTY(Constants.NUMBER_THIRTY);

        int value;

    private EnumConstants(int value) {
        this.value = value;
    }

    public int value() {
        return value;

    }

}

因此,通过这种方式,您可以实现代码重用性、代码可读性和可维护性。将来,如果月份的值发生了变化,如一个答案中所述,那么您只需要更改常量类中的值。

第二个是所谓的优化,没有意义。请选择第一个。这一切都是关于可读性的。我几乎不会称之为少声明一两个变量的优化。这和直接使用30一样糟糕,因为如果你以后将值改为31,你的代码仍然到处都读30,你无论如何都会想改变它。第二个是所谓的优化,毫无意义。请选择第一个。这一切都是关于可读性的。我几乎不会称之为少声明一两个变量的优化。这和直接使用30一样糟糕,因为如果您稍后将值更改为31,代码仍然会在任何地方读取30,并且您仍然希望更改它。请参阅