Java 参数验证是否应该延迟执行

Java 参数验证是否应该延迟执行,java,exception,lazy-initialization,Java,Exception,Lazy Initialization,下面是实例成员惰性初始化的代码。这就给我留下了何时执行参数验证的问题。代码中有两个不同的函数执行NPE检查,一个延迟,另一个不延迟。我选择了第一个选项,但只是想知道什么是行业惯例/最佳实践 public class FreeMain { private List<Integer> fooList; FreeMain ( ) { } /** * This code does a check null pointer kind of just i

下面是实例成员惰性初始化的代码。这就给我留下了何时执行参数验证的问题。代码中有两个不同的函数执行NPE检查,一个延迟,另一个不延迟。我选择了第一个选项,但只是想知道什么是行业惯例/最佳实践

public class FreeMain {

    private List<Integer> fooList;

    FreeMain ( ) {  }

    /**
     * This code does a check null pointer kind of just in time.
     * 
     * @param barList
     */
    public void putListExceptionCheckDoneLater(List<Integer> barList) {
        if (this.fooList == null) {
            if (barList == null) throw new NullPointerException();
            this.fooList = barList;
        }
    }

    /**
     * In the even that fooList != null, 
     * throwing an exception would be of no benefit, 
     * since regardless of input, null or not, net effect would still be a no-op.
     * 
     * @param args
     */
    public void putListExceptionCheckDoneBefore(List<Integer> barList) {
        if (barList == null) throw new NullPointerException();
        if (this.fooList == null) {
            this.fooList = barList;
        }
    }

    public static void main(String[] args) {

    }
}
公共类FreeMain{
私人名单傻瓜;
弗里曼(){}
/**
*这段代码执行一种检查空指针的方式。
* 
*@param barList
*/
公共无效PutListExceptionCheckdEnabler(列表栏列表){
if(this.whoolist==null){
如果(barList==null)抛出新的NullPointerException();
this.whoolist=barList;
}
}
/**
*即使是那个傻瓜!=null,
*抛出异常没有任何好处,
*因为不管输入是否为空,净效应仍然是不可操作的。
* 
*@param args
*/
public void putListExceptionCheckDoneBefore(列表栏列表){
如果(barList==null)抛出新的NullPointerException();
if(this.whoolist==null){
this.whoolist=barList;
}
}
公共静态void main(字符串[]args){
}
}

此代码是定制的,用于询问特定疑问,因此请避免提出诸如“为什么不使用构造函数通过列表?”等问题,或建议与此问题无关的代码改进。

我看不出推迟参数验证的意义,当然,对于像检查
null
这样轻量级的东西。它也有一些明显的缺点:

  • (正确)延迟验证使代码更加复杂

  • (正确)延迟验证将导致验证错误在为时已晚时突然出现


话虽如此,你的例子的逻辑对我来说没有多大意义。这两个版本之间的真正区别在于,如果第一个版本不打算使用它,它根本不会检查它的参数。这不是“懒惰”的意思。这只是以不同的顺序做事。。。并由此产生不同的结果

(无论如何,我更愿意检查
barList
是否始终为
null
,前提是参数为
null
,这样做可能会更早发现bug。)


请注意,真正的惰性验证可能是这样的:

public class LazyValidationExample {

    private List<Integer> fooList;

    public void putListExceptionCheckDoneLater(List<Integer> barList) {
        this.fooList = barList;
    }

    public List<Integer> getList() {
        if (this.fooList == null) throw new NullPointerException();
        return this.fooList;
    }
    ...
}
公共类LazyValidationExample{
私人名单傻瓜;
公共无效PutListExceptionCheckdEnabler(列表栏列表){
this.whoolist=barList;
}
公共列表getList(){
如果(this.傻瓜==null)抛出新的NullPointerException();
把这个还给我。傻瓜;
}
...
}

我看不出推迟参数验证有什么意义,当然是对于像检查
null
这样轻量级的东西。它也有一些明显的缺点:

  • (正确)延迟验证使代码更加复杂

  • (正确)延迟验证将导致验证错误在为时已晚时突然出现


话虽如此,你的例子的逻辑对我来说没有多大意义。这两个版本之间的真正区别在于,如果第一个版本不打算使用它,它根本不会检查它的参数。这不是“懒惰”的意思。这只是以不同的顺序做事。。。并由此产生不同的结果

(无论如何,我更愿意检查
barList
是否始终为
null
,前提是参数为
null
,这样做可能会更早发现bug。)


请注意,真正的惰性验证可能是这样的:

public class LazyValidationExample {

    private List<Integer> fooList;

    public void putListExceptionCheckDoneLater(List<Integer> barList) {
        this.fooList = barList;
    }

    public List<Integer> getList() {
        if (this.fooList == null) throw new NullPointerException();
        return this.fooList;
    }
    ...
}
公共类LazyValidationExample{
私人名单傻瓜;
公共无效PutListExceptionCheckdEnabler(列表栏列表){
this.whoolist=barList;
}
公共列表getList(){
如果(this.傻瓜==null)抛出新的NullPointerException();
把这个还给我。傻瓜;
}
...
}

我看不出推迟参数验证有什么意义,当然是对于像检查
null
这样轻量级的东西。它也有一些明显的缺点:

  • (正确)延迟验证使代码更加复杂

  • (正确)延迟验证将导致验证错误在为时已晚时突然出现


话虽如此,你的例子的逻辑对我来说没有多大意义。这两个版本之间的真正区别在于,如果第一个版本不打算使用它,它根本不会检查它的参数。这不是“懒惰”的意思。这只是以不同的顺序做事。。。并由此产生不同的结果

(无论如何,我更愿意检查
barList
是否始终为
null
,前提是参数为
null
,这样做可能会更早发现bug。)


请注意,真正的惰性验证可能是这样的:

public class LazyValidationExample {

    private List<Integer> fooList;

    public void putListExceptionCheckDoneLater(List<Integer> barList) {
        this.fooList = barList;
    }

    public List<Integer> getList() {
        if (this.fooList == null) throw new NullPointerException();
        return this.fooList;
    }
    ...
}
公共类LazyValidationExample{
私人名单傻瓜;
公共无效PutListExceptionCheckdEnabler(列表栏列表){
this.whoolist=barList;
}
公共列表getList(){
如果(this.傻瓜==null)抛出新的NullPointerException();
把这个还给我。傻瓜;
}
...
}

我看不出推迟参数验证有什么意义,当然是对于像检查
null
这样轻量级的东西。它也有一些明显的缺点:

  • (正确)延迟验证使代码更加复杂

  • (True)惰性验证将被删除