我正在设计一个实体类,它有一个名为"documentYear"的字段,可能有无符号整数值,如1999,2006等.同时,这个字段也可能是"未知",也就是说,不确定文档是哪一年创建.
因此,C#中的可空int类型将非常适合.但是,Java没有像C#那样可以为空的特性.
我有两个选择,但我不喜欢它们:
java.lang.Integer而不是原始类型int;有没有人有更好的选择或想法?
更新:我的实体类将有数万个实例; 因此,java.lang.Integer的开销可能对系统的整体性能来说太重了.
我试图在Java中创建一个nullalble对象,但不知道如何做到这一点,在C#这将是这样做的
int? someTestInt;
Run Code Online (Sandbox Code Playgroud)
这允许我检查null,而在某些情况下我可以使用0值,这不总是可能的,因为某些执行路径允许0值
假设我有 test.proto 文件:
syntax = "proto3";
option java_package = "testing";
option java_outer_classname = "Test_v1";
import "google/protobuf/wrappers.proto";
message TestMessage {
.google.protobuf.Int32Value integerField = 1;
}
Run Code Online (Sandbox Code Playgroud)
如果我将它编译(使用 protoc v3.5.0)到 C# 代码,我将获得可为空的类型属性:
public int? IntegerField {
get { return integerField_; }
set { integerField_ = value; }
}
Run Code Online (Sandbox Code Playgroud)
但是如果我将它编译为 Java 代码,字段将是众所周知的类型:
public Builder setIntegerField(com.google.protobuf.Int32Value value) {
if (integerFieldBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
}
integerField_ = value;
onChanged();
} else {
integerFieldBuilder_.setMessage(value);
}
Run Code Online (Sandbox Code Playgroud)
我正在将项目从 proto2 移至 proto3,因此我想避免使用众所周知的类型,因为更改相关代码需要大量工作。对于 …