可用于以不同方式表示null和缺席的Java类
我想知道是否有一个现成的Java类可以与Guava的可选类类似使用,但对null和缺席的处理方式不同 我有一个用例,需要传递一个带有字符串值、null值或缺席(不提供任何内容)的方法参数。Null是一个纯有效值,具有特殊含义 我试着使用番石榴的可选成分,但发现它不能区分null和缺席。将空值传递到可选值表示不存在 我想知道是否有一个现成的Java实用程序可以用于我的用例:它可以携带值、空值或无值(不存在)可用于以不同方式表示null和缺席的Java类,java,guava,Java,Guava,我想知道是否有一个现成的Java类可以与Guava的可选类类似使用,但对null和缺席的处理方式不同 我有一个用例,需要传递一个带有字符串值、null值或缺席(不提供任何内容)的方法参数。Null是一个纯有效值,具有特殊含义 我试着使用番石榴的可选成分,但发现它不能区分null和缺席。将空值传递到可选值表示不存在 我想知道是否有一个现成的Java实用程序可以用于我的用例:它可以携带值、空值或无值(不存在) 非常感谢空字符串(“”)不是与字符串的“无值”相同吗?显然,这对数字不起作用,但您具体说的
非常感谢空字符串(“”)不是与字符串的“无值”相同吗?显然,这对数字不起作用,但您具体说的是字符串。java语言可以做到这一点:使用token对象表示“缺席” 假设它是字符串类型:
private static final String ABSENT = new String(""); // not interned
private String attribute = ABSENT;
public boolean attributeIsSet() {
return attribute == ABSENT; // identity comparison
}
public String getAttribute() {
if (attributeIsSet())
return attribute;
throw new IllegalStateException(); // or whatever
}
这允许
null
为有效值。您应该使用可选值
可选
是指您知道存在或不存在某种东西。通过返回<代码>空值
Optional<A> a = Optional.of(new A()); // We know that A is present.
Optional<B> b = Optional.absent(); // We know that B is absent.
Optional<C> c = null; // We don't know if C is present or absent.
Optional a=Optional.of(new a());//我们知道有人在场。
可选b=可选。缺席();//我们知道B缺席了。
可选c=null;//我们不知道C是否存在。
使用null
并不坏:它容易出错。所以要小心,正确地记录您想要做的事情以及应该如何解释null
空。。。具有特殊的意义
每当你发现自己这样说的时候,你的设计应该值得重新思考,因为null
根据定义没有任何意义。让我们退一步看看您的需求(如果不准确,请随时更新问题,更好地描述您的意图):
- 缺勤:表示我们在这里无事可做
:表示“特殊值”,如null
或DEFAULT
,应特别处理FALLBACK
- 值:可以直接处理的“正常”值,包括空字符串
Optional
可以非常成功地表示这一点,但我们需要更好地构造它
虽然我们无法避免数据库中的NULL
s,但我们可以努力将它们的范围限制在围绕数据库访问行为的最小代码上,并且只公开它。从概念上讲,我们通过将可空字段转换为可选
s来实现这一点,如您所知。因此,col VARCHAR NULL
应始终尽快转换为Java作为可选col
但是现在我们需要表示缺勤情况,例如当我们从表LIMIT 1中选择col时,
从查询中什么也没有得到。显然,这应该以不同的方式处理,而不是返回一个NULL
我们有两种选择,但它们都归结为以某种方式将我们的可选
包装到另一个层中
在许多情况下,您可以简单地使用列表
或其他集合
。通过传回一个非空集合,我们通常可以轻松地处理不存在的情况,因为如果列表
为空,我们的代码将不会进入任何循环,否则将处理数据。因此,List
是一种选择
如果这是不可能的,并且您确实希望将行为限制为一个或无,例如在上面的限制1
示例中,只需将其包装在另一个可选
,即可选
。这清楚地传达了缺少结果和类型安全方式中缺少值之间的区别
多一点工作,但更好的是在自己的类中恰当地表示这个结构(任何时候泛型都有泛型,考虑创建一个适当的保持类),因为实际上我们所讨论的是一个可选的数据段,它本身可能包含一个可选的数据块。
public class Row {
private final Optional<String> col;
public Row(@Nullable String col) {
this.col = Optional.fromNullable(col);
}
public Optional<String> getCol() {
return col;
}
}
公共类行{
私人最终选择;
公共行(@Nullable String col){
this.col=可选的.fromNullable(col);
}
公共可选getCol(){
返回列;
}
}
然后传递可选的
对象,这些对象很明显要么存在要么不存在,要么包含结果,要么不包含结果。所有类型都是安全的,不需要null
s
tl;dr:这可以用
可选的来合理地表示,或者参见上面的其他建议。如果您没有这样的类,您将如何实现它?缺席是什么意思?缺席是指没有指定值。例如,如果您想使用该值作为DB的搜索参数,null值表示particualr值为null,缺席表示我不关心该值,任何内容都将匹配。感谢您的回复。我的意思是没有值。根据用例的不同,
可能意味着“没有值”,也可能是有意义的值。由于“
与null
具有类似的模糊性,因此使用”
来表示某种类型的哨兵值通常也是一种糟糕的模式。这稍微好一点,至少你不会得到NPE,但在可能的情况下还是应该避免。我对此投了赞成票,但改变了主意。我不能在不投反对票的情况下取消我的上升票,所以我觉得有必要发表评论。OP想要第二种“不在那里”。您的建议会起作用,但这并不比对只有一种“notthere”而不是可选值的值使用null好多少。这不是一个现成的课程,它为2个不在那里的人提供了与1个不在那里的人一样的好处。我理解你的观点,如果你不再觉得这是一个问题,请投反对票