【发布时间】:2022-01-19 17:53:57
【问题描述】:
我需要区分具有空值的属性和根本不存在的属性。我可以使用地图,但出于性能原因,我尝试使用固定大小的数组。
在数组中,我可以使用null 来指示某个属性何时根本不存在。但是,对于确实存在且值为 null 的属性,是否有一种标准方法可以在数组中表示它?
我想保留一个静态成员,例如
class MyClass {
private static final Object NULL = new Object(); // null wrapper
private Object[] m_arr = new Object[10];
// 'i' represents the index of a property in the array
boolean exists(int i) {
return m_arr[i] != null;
}
Object value(int i) {
if( !exists(i) ) throw new NullPointerException(); // does not exist
if( m_arr[i] == NULL ) return null;
// ... handling for other data types ...
}
}
表示 null 的另一种可能性可能是枚举?
class MyClass {
...
enum Holder {
NULL
}
...
// to check for a null value use m_arr[i] == Holder.NULL
}
【问题讨论】:
-
没有。您重视的
NULL很好(它也是私有的)。Optional.empty()也可能是一个很好的候选者,因为它是一个全局单例(我希望,对吧?)——这样你就可以简单地让你的NULL指向Optional.empty()而甚至不创建一个愚蠢的新对象。此外,抛出NullPointerException可能不是一个很好的选择:NoSuchElementException更适合这里。 -
听起来你把事情复杂化了。你确定这不是XY Problem?
-
无法理解这个陈述,因为“存在”和“空”是相反的......“但是,对于确实存在且为空的属性......”
-
只要保持一致(“nulling code”在哪里??),随心所欲! :):) 可能一个“地图”或(至少)两个数组(一个带有“属性”,一个带有“值”)会更好......适合(无论您尝试完成什么)
-
没关系:OP 可以看到的差异就像 JavaScript 中
null之间的差异(我们知道它没有价值,比如 OP 的Optinal.empty()或NULL)和 @987654334 @(我们根本不知道它是什么,因为它可能也不存在,null用于 OP)。 OP 实际上是在做一个标记对象,表示保存在Optional.of盒子上的空值对象(只要它是私有实现就可以了)。