我非常喜欢静态类型检查。它可以防止您犯以下愚蠢的错误:
// java code
Adult a = new Adult();
a.setAge("Roger"); //static type checker would complain
a.setName(42); //and here too
但这并不能阻止您做出如下愚蠢的错误:
Adult a = new Adult();
// obviously you've mixed up these fields, but type checker won't complain
a.setAge(150); // nobody's ever lived this old
a.setWeight(42); // a 42lb adult would have serious health issues
当您使用相同的类型表示明显不同的信息时,就会出现问题。我当时想解决这个问题的一个好的解决方案是扩展Integer
类,只是为了防止业务逻辑错误,而不是增加功能。例如:
class Age extends Integer{};
class Pounds extends Integer{};
class Adult{
...
public void setAge(Age age){..}
public void setWeight(Pounds pounds){...}
}
Adult a = new Adult();
a.setAge(new Age(42));
a.setWeight(new Pounds(150));
这被认为是好的做法吗?还是这种限制性设计会在将来带来无法预料的工程问题?
new Age(...)
对象后,您将无法Weight
在其他任何地方将其错误地分配给类型变量。它减少了可能发生错误的地方。
a.SetAge( new Age(150) )
还是不会编译?