Codes – Kotlin 和 Java 的类型化应用结果
摘要
Codes 是一个用于 JVM 应用程序的库,提供稳定的输出标识和显式映射,支持 HTTP 和 gRPC,且具有零运行时依赖。
查看缓存全文
缓存时间: 2026/09/01 12:33
aalsanie/codes 来源:https://github.com/aalsanie/codes
代码库
适用于 Java 17+。零运行时依赖。 Maven Central (https://central.sonatype.com/artifact/io.github.aalsanie/codes) 持续集成 (https://github.com/aalsanie/codes/actions/workflows/ci.yml) 许可协议
Codes 为 JVM 应用提供稳定的应用结果标识和显式的边界映射。应用保留自己的领域结果或错误模型,并在系统多个部分需要就结果含义达成一致,且不希望将该含义与 HTTP、gRPC、序列化或特定框架耦合时,使用 Codes。领域结果可以在跨边界时保持相同的标识:
文本 com.example.payments:PAYMENT_DECLINED
| +-- HTTP 422
+-- gRPC FAILED_PRECONDITION
+-- 日志/指标 保持 PAYMENT_DECLINED
安装
Gradle:
dependencies {
implementation("io.github.aalsanie:codes:0.3.1")
}
Maven:
<dependency>
<groupId>io.github.aalsanie</groupId>
<artifactId>codes</artifactId>
<version>0.3.1</version>
</dependency>
适用于 Java 17+。零运行时依赖。 Kotlin 应用通过 JSpecify 空值安全元数据使用相同的 Java API。
自定义结果
OutcomeDefinition paymentDeclined = OutcomeDefinition.custom(
"com.example.payments",
"PAYMENT_DECLINED",
OutcomeState.FAILED,
"The payment was declined."
);
Outcome outcome = Outcome.of(paymentDeclined);
HttpOutcomeMapper http = HttpOutcomeMapper.standard()
.withMapping(paymentDeclined, HttpStatusCode.of(422));
GrpcOutcomeMapper grpc = GrpcOutcomeMapper.standard()
.withMapping(paymentDeclined, GrpcStatusCode.FAILED_PRECONDITION);
OutcomeCode 是稳定的机器标识。协议映射不会改变该标识。
标准结果
文本
OK
INVALID_ARGUMENT
UNAUTHENTICATED
PERMISSION_DENIED
NOT_FOUND
ALREADY_EXISTS
FAILED_PRECONDITION
OUT_OF_RANGE
RATE_LIMITED
CANCELLED
DEADLINE_EXCEEDED
ABORTED
UNIMPLEMENTED
UNAVAILABLE
INTERNAL
DATA_LOSS
RESOURCE_EXHAUSTED
OK 是标准的成功结果。当标准目录不匹配操作时,应用会定义特定于领域的成功、待处理和失败结果。
运行时发生实例
Outcome outcome = Outcome.of(
StandardOutcomes.NOT_FOUND,
"customerId=123"
);
System.out.println(outcome.getCode());
System.out.println(outcome.getMessage());
System.out.println(outcome.getDetail());
message 来自可复用的定义。detail 属于单个发生实例。
结构化问题
ValidationResult validation = ValidationResult.invalid(
Issue.at("email", "Invalid email address.")
);
Outcome outcome = validation.toOutcome(StandardOutcomes.INVALID_ARGUMENT);
ValidationResult 是一个用于聚合问题的小型便利工具。它并非旨在取代应用的结果、验证或函数式编程模型。
HTTP
HttpStatusCode status = HttpOutcomeMapper.standard()
.map(StandardOutcomes.NOT_FOUND)
.orNull();
assert status == HttpStatusCode.NOT_FOUND;
某些标准结果在 HTTP 映射中被有意留空,因为正确的状态码取决于具体应用。
gRPC
GrpcStatusCode status = GrpcOutcomeMapper.standard()
.map(StandardOutcomes.NOT_FOUND)
.orNull();
assert status == GrpcStatusCode.NOT_FOUND;
标准 gRPC 映射器覆盖所有标准结果。
Kotlin
Java 的 getter 和静态工厂可直接作为 Kotlin 的属性和函数调用:
val outcome = Outcome.of(StandardOutcomes.NOT_FOUND, "customerId=123")
val status = HttpOutcomeMapper.standard().map(outcome).orNull()
check(outcome.code == StandardOutcomes.NOT_FOUND.code)
check(status?.value == 404)
参考资料
许可协议
Apache 许可证 2.0 版。
相似文章
适用于JetBrains的Kilo Code
Kilo Code for JetBrains 是一款原生开源的编程代理,可与 JetBrains IDE 集成,支持本地和远程开发,并具有并行代理、GitHub PRs 以及访问超过500种模型的功能。
rustc_codegen_jvm: 可生成JVM字节码的Rust编译器后端
rustc_codegen_jvm 是一个自定义的Rust编译器后端,能够生成JVM字节码,从而将Rust代码编译成可在JVM 8+上运行的JAR文件。它支持多种Rust特性,包括控制流、数据结构、特征(traits)和闭包。
Kilo-Org/kilocode
Kilo Code 是一个开源 AI 编程代理,集成了 VS Code、JetBrains 和 CLI,支持 500 多个模型,按提供商定价无加价。
Decypher:面向智能体编程与工程的深度语义代码图(现已推出测试版)
Decypher 是一种深度语义代码图工具,可帮助 AI 智能体理解代码结构、数据流和安全问题,现已针对 Java 及 JVM 语言推出测试版。
Koder:基于浏览器界面的编码和计算机使用工具
发布Koder,一个本地/离线的AI编码和计算机使用工具,具有浏览器界面,支持llama.cpp、MCP、视觉模型和多任务规划。