Java:特殊意义的null替代品

Java:特殊意义的null替代品,java,Java,在Java中,对象派生类型的每个变量都可以是该类型的实例或null—据我所知 还有别的选择吗?e、 g.不是实例,但也不是null 我需要代表一个特殊的国家 e、 g.将其用作搜索函数中的参数,该函数可以表示常规值、“空”为null或“任意”为通配符 示例中的类型为整数。但它应该是通用的。所以没有Integer.MAX会有帮助 如果可能的话,我希望在不添加任何“标志变量”的情况下执行此操作。无法将非空值或正确类型的实例分配给引用变量 但是有很多方法可以模拟 看一看,它提供了一个对象,该对象可以不

在Java中,对象派生类型的每个变量都可以是该类型的实例或null—据我所知


还有别的选择吗?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(); 
    }
}