我应该在包装器 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
...}
三种情况:
- 我只设置名字和姓氏,留下
socialSecurity = null
- 我将只设置姓氏和社会保障,
leaving name = null
- 我只设置姓氏,
leaving name = null
和socialSecurity = null
我的问题:当不需要某个属性时最好使用 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;
}
我为几个字符串写了一个 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
...}
三种情况:
- 我只设置名字和姓氏,留下
socialSecurity = null
- 我将只设置姓氏和社会保障,
leaving name = null
- 我只设置姓氏,
leaving name = null
和socialSecurity = null
我的问题:当不需要某个属性时最好使用 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;
}