我是从 C++ 转到 Java,不用说,某些事情看起来有点不自然(相对于我的 C++ 背景)。例如,Java 没有无符号数字类型。所以我很好奇在某些情况下是否有最好的或传统的方法来检查标志。
例如,假设我正在设计一个动态数组类。我想跟踪数组的大小,我可以将其声明为
私有(private)整数长度
如果一个数组需要调整大小,它应该通过一组 block_size
来调整大小,所以我也应该有
private int block_size
现在,我应该允许用户设置block_size
,我当然应该有类似的东西
public void setValueAt(int pos) { ... }
public void setBlockSize(int bsize) { ... }
现在,因为我们没有无符号数字类型,而且因为——在 OOD 的最佳实践中——对象应该是一致的,我应该防止像 setValueAt(-1)
这样的错误.
显而易见的方法是一个简单的if
条件检查。有人可能会争辩说我可以简单地让它滑动,因为在引用数组时,Java 会提示负索引并抛出编译时错误。如果在编译时索引是已知的,这很好,但如果不是,则不是。
更糟糕的情况是 block_size
。在调整大小之前,程序可以运行很长时间,此时可能会发生运行时异常或不可预测的行为。
所以我的问题是:
What is the (or one of the) Java idiomatic ways/design patterns to handle this? Am I making it too complicated (i.e. should I just stick with the
if
checks and get on with life)?
这个问题,我认为,在不那么琐碎的上下文中(比上面的例子)变得不那么琐碎。例如,我不想用 if
检查污染我的代码。将任务委托(delegate)给指定的错误处理程序会很好,这应该是类型固有的。例如:
Would it be more idiomatic to write a wrapper around the
int
type? Is there an elegant/idiomatic way to useInteger
for this purpose?
编辑
我似乎收到了很多关于此的评论(我很感激),但许多人并没有关注实际问题。数组类就是一个例子。我要求一种通用的、惯用的方法来处理可能在许多不同情况下出现的一般情况。
最佳答案
如果您不想在每个方法中进行多次检查来污染您的代码,请查看 guava library .它实际上阻止您编写大量自行车,提供通用功能,这些功能不是(在编写库的时候没有)在 Java SE 中实现的。例如,它为您提供单行检查,例如:
Preconditions.checkNotNull(obj);
Strings.isNullOrEmpty(str);
顺便说一句,此功能的一部分现在由 Objects 类在 Java 8 中实现。
注意:在 Java 中将可调整大小的数组作为一个单独的类进行讨论时,我感到非常不自在。请注意,ArrayList 解决了完全相同的问题。
关于用于检查整数符号的 Java 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37645523/