Java:特殊意义的null替代品
在Java中,对象派生类型的每个变量都可以是该类型的实例或null—据我所知Java:特殊意义的null替代品,java,Java,在Java中,对象派生类型的每个变量都可以是该类型的实例或null—据我所知 还有别的选择吗?e、 g.不是实例,但也不是null 我需要代表一个特殊的国家 e、 g.将其用作搜索函数中的参数,该函数可以表示常规值、“空”为null或“任意”为通配符 示例中的类型为整数。但它应该是通用的。所以没有Integer.MAX会有帮助 如果可能的话,我希望在不添加任何“标志变量”的情况下执行此操作。无法将非空值或正确类型的实例分配给引用变量 但是有很多方法可以模拟 看一看,它提供了一个对象,该对象可以不
还有别的选择吗?e、 g.不是实例,但也不是null 我需要代表一个特殊的国家 e、 g.将其用作搜索函数中的参数,该函数可以表示常规值、“空”为null或“任意”为通配符 示例中的类型为整数。但它应该是通用的。所以没有Integer.MAX会有帮助
如果可能的话,我希望在不添加任何“标志变量”的情况下执行此操作。无法将非空值或正确类型的实例分配给引用变量 但是有很多方法可以模拟 看一看,它提供了一个对象,该对象可以不存在(大致相当于
null
),也可以存在(并且具有实际值)
您可以做类似的事情,但通过创建自己的类,我们可以使用3种状态来命名它SearchValue
:
public class SearchValue<T> {
private final T value;
private final boolean missing;
private final boolean wildcard;
private SearchValue(T value) {
this.value = value;
this.missing = false,
this.wildcard = false;
}
private SearchValue(boolean isMissing) {
this.value = null;
this.missing = isMissing;
this.wildcard = !isMissing;
}
public static <T> SearchValue<T> of(T value) {
return new SearchValue<>(value);
}
public static <T> SearchValue<T> missing() {
return new SearchValue(true);
}
public static <T> SearchValue<T> wildcard() {
return new SearchValue(false);
}
public T getValue() {
if (value == null) {
throw new IllegalStateException("no value specified");
}
return value;
}
public boolean isValue() {
return value != null;
}
public boolean isMissing() {
return missing;
}
public boolean isWildcard() {
return wildcard;
}
}
公共类SearchValue{
私人最终T值;
私有最终布尔缺失;
私有最终布尔通配符;
私有搜索值(T值){
这个值=值;
this.missing=false,
this.wildcard=false;
}
私有搜索值(布尔isMissing){
this.value=null;
this.missing=isMissing;
this.wildcard=!isMissing;
}
公共静态搜索值(T值){
返回新的搜索值(value);
}
缺少公共静态搜索值(){
返回新的SearchValue(true);
}
公共静态SearchValue通配符(){
返回新的SearchValue(false);
}
公共T getValue(){
如果(值==null){
抛出新的IllegalStateException(“未指定值”);
}
返回值;
}
公共布尔值(){
返回值!=null;
}
公共布尔isMissing(){
返回丢失;
}
公共布尔通配符(){
返回通配符;
}
}
任何SearchValue
实例都将在isValue
、isMissing
或isWildcard
中的一个实例上返回true
(并且只有在isValue()
返回true时才从getValue()
成功返回)
请注意,这肯定是可以优化的(通过将标志减少到一个字段和/或确保只有一个丢失或通配符实例,因为它们是可交换的),但一般原则应该是明确的。不,变量要么为空,要么指向适当类型的对象,没有其他可能性。但是,您可以通过封装搜索词来实现您的目标,例如
public class SearchTerm<T> {
private final T value;
public static final SearchTerm WILDCARD = new SearchTerm<Object>(new Object());
public SearchTerm(T value) {
this.value = value;
}
public T getValue() {
return this.value;
}
}
这是有限制的,但对于预先存在的类,如
java.lang.Integer
,这是不可能的。可能的解决方案:将值包装在您自己编写的另一个对象中,该对象具有标记它表示特殊值的功能。仅可选
或可选
,并且似乎您希望向类添加一个位。由于Integer是最后一个类,因此有扩展的可能性。“是否有其他选择?例如,不是实例,但也不是null?”否。您可以指定实例(可能是子类)或null,没有别的。可能是一个自定义泛型类型,它保存值,但也可以跟踪您的状态,如空和通配符,但根据给定的信息很难知道
public class SearchTerm<T> {
private final T value;
public static final SearchTerm WILDCARD = new SearchTerm<Object>(new Object());
public SearchTerm(T value) {
this.value = value;
}
public T getValue() {
return this.value;
}
}
void doSearch(SearchTerm<String> searchTerm) {
if (searchTerm == SearchTerm.WILDCARD) {
// do a wildcard search
} else if (searchTerm.getValue() == null) {
// do whatever type of search this represents
} else {
// search for items that match this term
String searchTermValue = searchTerm.getValue();
}
}