我应该在包装器 class 中使用 Java 8 的 Optional 还是在不使用某些属性时使用 null?

Should I use Java 8's Optional in my wrapper class or null when not using some attributes?

我为几个字符串写了一个 Wrapper class。

    public class StringsWrapper { 
        private String name;

        private String surname;

        private String socialSecurity;


        public StringsWrapper()
        {
            name = null;
            surname = null;
            socialSecurity = null;
        }
    //getters and setters
    ...}

三种情况:

我的问题:当不需要某个属性时最好使用 null,或者我应该使用 Java 8 的实例 Optional?

我建议在这种情况下使用null,您以后可以更改它

如果您想指出其中一些可以为 null 的事实,并且代码的其余部分使用 streams/optionals 等,您可以使 getters return 可选:

Optional<String> getName() {
    return Optional.ofNullable(name);
}

Optional<String> getSurname() ...

etc.

您不应将实际字段类型设为 Optional。原因之一是这些不可序列化。

但一般来说,您描述的用例可能更适合某些 boolean 歧视性方法,例如 isSocialSecurityProvided(),您以后可以像这样使用:

if (sw.isSocialSecutiryProvided()) {
    // do something with
    sw.getSocialSecurity();
} else {
    //do domething with
    sw.getName();
    // and with 
    sw.getSurname();
}

即使整个方法看起来像下面的东西,有人可能会争辩说,正确命名它可以提供更好的代码可读性:

public boolean isSocialSecurityProvided() {
    return socialSecurity != null;
}