为何OpenAPI生成的Java成员与方法带有下划线前缀?
object、list为何被加上下划线前缀? 我在将OpenAPI模型渲染为Java代码时,遇到了一个奇怪的情况:在OpenFGA场景下有个名为"object"的关系对象模型,生成后的成员变量和部分方法被自动加上了下划线前缀,变成_object。示例代码如下:
成员变量:
public static final String JSON_PROPERTY_OBJECT = "object"; private String _object;
方法:
public TupleKey _object(String _object) { this._object = _object; return this; } /** * Get _object * @return _object **/ @javax.annotation.Nullable @JsonProperty(JSON_PROPERTY_OBJECT) @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) public String getObject() { return _object; } @JsonProperty(JSON_PROPERTY_OBJECT) @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) public void setObject(String _object) { this._object = _object; } public TupleKey relation(String relation) { this.relation = relation; return this; }
除此之外,list、file这类同样不是Java关键字的名称,生成代码时也被加上了下划线前缀。既然Java中"object"并非关键字,为什么生成器要自动添加下划线前缀?
这是OpenAPI代码生成器的命名规避策略导致的,核心原因并非这些词是Java关键字,而是它们属于两类需要规避的标识符:
Java生态高频常用类名:比如
object极易和java.lang.Object这个核心类名混淆,虽然语法上完全合法,但在代码编写、阅读时容易引发歧义;list对应java.util.List,file对应java.io.File,这类名称属于Java开发中高频出现的类名,生成器自动加下划线是为了避免和这些常用类的引用、导入产生命名冲突。生成器扩展的预留词规则:多数OpenAPI Java生成器会维护一份扩展的"预留词列表",除了Java官方定义的关键字(如
int、class),还会把一些容易引发问题的常用标识符纳入其中,自动对这些名称进行转义处理(加下划线是最常见的转义方式),确保生成的代码在各种编译、IDE环境下都能正常工作,同时提升代码可读性,避免开发者使用时出现不必要的混淆。
另外从示例代码能看到,生成器仅对成员变量和链式调用的setter方法(_object(String _object))加了下划线,但标准的getter/setter(getObject()、setObject())仍使用正常名称——这是为了兼顾JavaBean规范,既规避了命名冲突,又保证了Jackson等序列化框架能正常识别属性。
内容的提问来源于stack exchange,提问作者booniepepper

