Java实体类如何通过命名常量替代getter方法获取字段值
实现方案说明
核心逻辑澄清
Java中类的私有属性默认无法从类外部直接访问,你要的foo.ID直接取值的效果,有两种可行实现方式,不需要额外定义枚举,也不需要自定义构造方法:
方案1:调整属性访问修饰符(最简单,符合你的调用写法要求)
直接把实体类的私有属性改为public,同时和JPA注解兼容,ORM框架依然可以正常映射字段值:
@Entity @Table(name="FOO", schema = "...") public class FOOentity { // 直接用public修饰,外部可以直接访问属性 public Integer id; public String name; // JPA要求必须保留无参构造方法 public FOOentity() {} // 可以保留getter/setter不影响现有逻辑,也可以删掉 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
调用的时候直接写foo.id、foo.name就可以拿到对应值,不需要调用getter方法。
方案2:用public static final定义字段名常量(适合统一维护字段名的场景)
如果你要的不是直接取实例属性值,是在写SQL、条件构造的时候统一引用字段名避免拼写错误,就可以用静态常量:
@Entity @Table(name="FOO", schema = "...") public class FOOentity { // 定义字段名常量,属于类本身,用FOOentity.ID引用 public static final String ID = "id"; public static final String NAME = "name"; private Integer id; private String name; // 正常保留getter/setter即可 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
这种场景下常量只存字段名字符串,不能直接拿到实例对应的id值,适合拼接SQL、MyBatis/QueryDSL等框架的条件构造场景。
关于查询逻辑的问题
你要拿到id为1的那条数据输出,不需要单独写单条查询,直接遍历全部结果判断id即可,示例代码调整后如下:
List<FOOentity> foolist = getDAOService.findall(); for (FOOentity foo : foolist) { // 直接访问public属性判断id是否为1 if (foo.id == 1) { System.out.println("FOO id / name: " + foo.id + " / " + foo.name); } }
运行后就能得到你预期的输出结果。
补充说明
- 如果是企业级项目开发,不推荐随意把实体类属性改为public,会破坏封装性,优先还是用getter方法取值更规范
- 静态常量本身是类共享的,不能存储每个实例各自的id、name值,不要用静态常量存实例数据
内容的提问来源于stack exchange,提问作者hmpm
相关产品推荐
相关产品推荐

