Java Proto 名称
本文档包含有关基于不同 proto 选项的 proto 的完全限定 Java 名称的信息。此名称对应于您需要导入以使用该消息的包。
建议
从 2024 版开始,最佳实践是
- 设置
option java_package = "com.example.package" - 不要设置
java_outer_classname或features.(pb.java).nest_in_file_class = YES。
从 2024 版开始,默认行为已得到改进,因此默认行为被认为是当前最佳实践。
使用 Proto2、Proto3 或 2023 版时,最佳实践是
- 设置
option java_multiple_files = true; - 设置
option java_outer_classname = "FileNameProto"; - 设置
option java_package = "com.google.package";
说明
多个文件
使用 java_multiple_files = true 后,每条消息生成的 Java 类都将放在单独的 .java 文件中。这使得将消息从一个 .proto 文件移动到另一个文件变得更加容易。
从 2024 版开始,此功能已被 features.(pb.java).nest_in_file_class 功能取代,该功能具有默认值 NO,与旧版语法的 java_multiple_files = true 行为相匹配。
外部类名
为 .proto 文件本身会生成一个 Java 类。如果未指定,该文件的类名将自动生成。但是,如何生成该名称的规则过于复杂且不直观。最佳策略是显式设置 java_outer_classname 选项,将 .proto 文件名转换为 PascalCase 并移除 '.'。例如
文件
student_record_request.proto应设置为option java_outer_classname = "StudentRecordRequestProto";
从 2024 版开始,java_outer_classname 仍然可用,但默认行为已更改为匹配此建议,因此无需设置。
Java 包
生成绑定文件的 Java 包将自动设置为 proto 包。但通常这不符合 Java 约定。为确保 Java 包名称符合约定,我们建议显式设置 java_package 选项。例如,在 Google 内部,约定是在 proto 包前加上 com.google.。
不可变 API 消息名称
protoc 的 Java 插件将根据此表生成名称。
| java_multiple_files | java_package | java_outer_classname | 生成的完整消息名称 |
|---|---|---|---|
| true | 未定义 | 忽略 | com.google.protos.$package.$message |
| true | 已定义 | 忽略 | $java_package.$message |
| false | 未定义 | 未定义 | com.google.protos.$package.$derived_outer_class.$message |
| false | 未定义 | 已定义 | com.google.protos.$package.$java_outer_classname.$message |
| false | 已定义 | 未定义 | $java_package.$derived_outer_class.$message |
| false | 已定义 | 已定义 | $java_package.$java_outer_classname.$message |
图例
$message是 proto 消息的实际名称。$package是 proto 包的名称。这是 proto 文件中package指令指定的名称,通常位于文件顶部。$derived_outer_class是从 proto 文件名派生的名称。通常通过移除文件名中的标点符号并将其转换为 PascalCase 来计算。例如,如果 proto 文件是foo_bar.proto,则$derived_outer_class的值为FooBar。如果生成的类名与 proto 文件中定义的某个消息相同,则
derived_outer_class会附加OuterClass。例如,如果 proto 文件是foo_bar.proto且包含FooBar消息,则$derived_outer_class的值为FooBarOuterClass。使用 v1 API 时情况相同,无论类名是否与定义的消息之一相同。所有其他
$names都是.proto文件中定义的相应文件选项的值。