- 优先定义在枚举类中
public enum Constants {
TRUE(1),FALSE(2); // 每一个都是全局唯一的实例(单实例)
private int status;
private Constants(int status){
this.status = status;
}
public int getStatus() {
return status;
}
}
- 其次是常量类中,以 final 字段修饰 class 防止其被继承,并将其构造函数 private 化,防止被实例化。
public final class Constants {
private Constants() {}
public static final int TRUE = 1;
public static final int FALSE = 0;
}
- (不推荐)在接口中定义常量
interface 的属性默认是 public static final
public interface MyInterface {
int CONSTANT_VALUE = 100; // 默认是 public static final
}
abstract class抽象类常作为工具类使用 (Spring 中工具类代码是这样, 常量也可放在工具类中)
abstract class是一种不能实例化的类, 可包含抽象方法, 除此之外和普通类没有别的不同
接口的可用之处
在《Effective Java》一书中写到,因为接口可以被继承,常量内容会代入到实现类代码中。这样对于一个接口来说是不合理。
但在一个已存在的类中, 可以作为内部分组:在类内部使用接口,作为内部接口。更直观简洁。
public static final String EMAIL = "email";
public static final String USERNAME = "custNo";
public interface Role {
int ROLE_NORMAL = 0; // 普通用户
int ROLE_ADMIN = 1; // 管理员
}
工具类
- 工具类推荐使用 Spring 的方式, 使用抽象类即可
// Spring 工具类定义
public abstract class StringUtils {
}
// Spring 的常量也定义在类中
public class MediaType extends MimeType implements Serializable {
public static final String APPLICATION_JSON_VALUE = "application/json";
}
- 示例
public abstract class UUIDUtils {
public static String generatedUUID16() {
return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16);
}
}
本文探讨了在Java中定义常量的三种方式:枚举、常量类和接口。枚举提供全局唯一的实例,适合状态有限的场景。常量类通过final字段和私有构造函数确保不可实例化,适合定义一组相关常量。接口定义常量虽然不推荐,但在内部接口中仍有一定适用性。同时,文章提到了工具类的创建,建议使用抽象类如`UuidUtils`来提供静态方法。
324

被折叠的 条评论
为什么被折叠?



