Java 我们应该使用常量作为描述性变量名来初始化某些字段的默认值?

Java 我们应该使用常量作为描述性变量名来初始化某些字段的默认值?,java,design-patterns,Java,Design Patterns,我发现了一个具有以下结构的实现(摘自本书): 为了阐述我的问题,我对具体类做了如下修改: public class NYStyleCheesePizza extends Pizza { private static final String DEFAULT_NAME = "NY Style Sauce and Cheese Pizza"; private static final String DEFAULT_DOUGH = "Thin Crust Dough"; pr

我发现了一个具有以下结构的实现(摘自本书):

为了阐述我的问题,我对具体类做了如下修改:

 public class NYStyleCheesePizza extends Pizza {
    private static final String DEFAULT_NAME = "NY Style Sauce and Cheese Pizza";
    private static final String DEFAULT_DOUGH = "Thin Crust Dough";
    private static final String DEFAULT_SOUCE = "Marina Souce";

    public NYStyleCheesePizza() {
        name = DEFAULT_NAME;
        dough = DEFAULT_DOUGH;
        souce = DEFAULT_SOUCE;
        toppings.add("Grated Regiano Cheese");
    } 
 ......
}
所以,我的问题是:


我们应该使用常量作为描述性变量名来初始化某些字段的默认值?

第一个假设是这些默认值只使用一次,否则为了保留代码,我们需要常量

鉴于上述假设,提取
字符串
常量的决定将始终是一个判断调用,因为它基于常量名称的主观值,即“描述性”。基本上,如果您觉得
DEFAULT\u NAME
相对于
NAME
(在构造函数中指定)提高了可读性,那么请务必提取常量。就我个人而言,在这种情况下,我觉得这种提高非常轻微;但是我承认,如果没有常量,我需要将
name
与构造函数的上下文结合起来,以导出常量显式表达的内容

您永远不应该这样做(再次假设一次使用常量)。
private静态最终字符串NAME=“NAME”
该常量在可读性方面没有增加任何值,不必要地增加了字符串的范围,并污染了类的命名空间


最后,请注意,
String
常量是一种特殊情况,因为它们的值可以传达它们的含义。其他(基本)常量,例如整数,可能应该总是提取出来。

第一个假设是这些默认值只使用一次,否则为了保留代码,我们需要常量

鉴于上述假设,提取
字符串
常量的决定将始终是一个判断调用,因为它基于常量名称的主观值,即“描述性”。基本上,如果您觉得
DEFAULT\u NAME
相对于
NAME
(在构造函数中指定)提高了可读性,那么请务必提取常量。就我个人而言,在这种情况下,我觉得这种提高非常轻微;但是我承认,如果没有常量,我需要将
name
与构造函数的上下文结合起来,以导出常量显式表达的内容

您永远不应该这样做(再次假设一次使用常量)。
private静态最终字符串NAME=“NAME”
该常量在可读性方面没有增加任何值,不必要地增加了字符串的范围,并污染了类的命名空间


最后,请注意,
String
常量是一种特殊情况,因为它们的值可以传达它们的含义。其他(基本)常量,例如整数,可能应该总是提取出来。

本书中的示例代码可能过于简单,以保持代码片段的简短。但一般来说,像您所做的那样提取常量是一种很好的做法;特别是当类更大的时候。天哪,不。在这种情况下,字符串文字是非常好的。如果在两个或多个地方需要该值,您可以为其定义一个变量。@bayou.io,我知道您使用OP的名称在那里做了什么。出于兴趣,本书试图用此代码演示什么设计模式?@Kyriacou FYI本书试图解释工厂模式(第4章)。IMHO,就本案而言,这不是相关信息。我只是以代码为例来阐述我的问题。书中的示例代码可能过于简单,因为代码片段很短。但一般来说,像您所做的那样提取常量是一种很好的做法;特别是当类更大的时候。天哪,不。在这种情况下,字符串文字是非常好的。如果在两个或多个地方需要该值,您可以为其定义一个变量。@bayou.io,我知道您使用OP的名称在那里做了什么。出于兴趣,本书试图用此代码演示什么设计模式?@Kyriacou FYI本书试图解释工厂模式(第4章)。IMHO,就本案而言,这不是相关信息。我只是以代码为例来阐述我的问题
public class NYStyleCheesePizza extends Pizza {
    public NYStyleCheesePizza() {
        name = "NY Style Sauce and Cheese Pizza";
        dough = "Thin Crust Dough";
        souce = "Marina Souce";
        toppings.add("Grated Regiano Cheese");
    }
    .......
}
 public class NYStyleCheesePizza extends Pizza {
    private static final String DEFAULT_NAME = "NY Style Sauce and Cheese Pizza";
    private static final String DEFAULT_DOUGH = "Thin Crust Dough";
    private static final String DEFAULT_SOUCE = "Marina Souce";

    public NYStyleCheesePizza() {
        name = DEFAULT_NAME;
        dough = DEFAULT_DOUGH;
        souce = DEFAULT_SOUCE;
        toppings.add("Grated Regiano Cheese");
    } 
 ......
}