我看到这分散在整个代码库中:
@RequestMapping(value = "myValue")
我更喜欢使用这样的东西:
@RequestMapping(value = Constants.myValue)
似乎使用内部的实际字符串值@RequestMapping
而不是常量来破坏 DRY。但这是良好的代码实践吗?我应该改用枚举吗?我可能需要Constants.myValue
在代码库的其他地方使用。
我看到这分散在整个代码库中:
@RequestMapping(value = "myValue")
我更喜欢使用这样的东西:
@RequestMapping(value = Constants.myValue)
似乎使用内部的实际字符串值@RequestMapping
而不是常量来破坏 DRY。但这是良好的代码实践吗?我应该改用枚举吗?我可能需要Constants.myValue
在代码库的其他地方使用。
我应该改用枚举吗?
你不能。注释变量必须是编译时常量。枚举和字符串文字都是,但是您不能创建一个作为字符串并且@RequestMapping
需要字符串的枚举(如果您的枚举有一个返回字符串或字符串字段的方法,那不是编译时常量)。由于有多轮注释处理,当常量在另一个类中时它确实有效。
那就是说:是的,我想说使用专用的常量类(可能是几个,用于不同类型的常量)是一种很好的做法,我可以尽可能使用它(只要常量a)它就可以与注释一起使用)没有定义在具有注释的同一编译单元内,并且 b) 在声明中初始化(与静态初始化块相反))。
这是一个例子:
控制器
@Controller @RequestMapping(value = Mappings.CUSTOMER_PAGE)
public class CustomerPageController{
// methods here
}
常量类
public static final class Mappings{
private Mappings(){}
public static final String CUSTOMER_PAGE = "path/to/customer/page"
// more constants
}
以下是一些不起作用的版本:
一种)
@Controller @RequestMapping(value = CUSTOMER_PAGE)
public class CustomerPageController{
private static final String CUSTOMER_PAGE = "path/to/customer/page";
}
这不会编译,因为注释引用了它注释的类中的常量。这是行不通的,因为在编译期间,注释在其余代码之前在单独的一轮中处理,而类需要注释已经被处理以进行编译(即注释和常量之间存在循环依赖关系)
b)
public static final class Mappings{
private Mappings(){}
public static final String CUSTOMER_PAGE;
static{
CUSTOMER_PAGE = "path/to/customer/page"
}
// more constants
}
虽然这是一个静态 final 字段,但它不是编译时常量,因此不能用作注释参数