在方法之前或之内检查相关变量的最佳实践

时间:2015-02-20 14:14:22

标签: java methods coding-style call

我想知道在某个帮助器方法运行之前有一个需要检查的变量时,最佳实践是什么。是否应该在来电者或被叫方进行检查?我看到两者都有好处。在调用方法中(在调用帮助器方法之前)这样做要便宜一些,但是这会将检查放在开发人员的肩膀上,如果代码切换(它会做),可能会丢失一些东西。因此,这是在被叫方中拥有它的好处。我的意思的一个非常粗略的例子是

public class TestClass implements TestInterface {

    private String dependentVariable = null;

    public TestClass(arg1) {
    }

    @Override
    public void init(String flag) {
        this.dependentVariable = flag;
        caller();
    }

    public void caller() {
        //do it here?
        if(this.dependentVariable != null)
            callee();
    }

    public void callee() {
        //or do the check here?
        // do stuff involving the dependentVariable...
    }

}

3 个答案:

答案 0 :(得分:2)

您应该在init()本身处理此问题。如果您的班级行为依赖于此变量,则不应让您的班级首先使用null进行初始化。

@Override
public void init(String flag) {
    if (flag == null)
        throw IllegalArgumentException("Flag cannot be null");
    this.dependentVariable = flag;
    caller();
}

如果缺少flag并且应该抢占callee()的执行,则应该在callee()内处理。

public void callee() {
    if (flag == null) return;
    // do stuff involving the dependentVariable...
}

这是因为,随着代码库的增长,在调用flag之前,您无法检查null是否在callee()进行了{{1}}检查。这也符合DRY原则。

答案 1 :(得分:0)

在您的示例中,最好将被叫私有或至少受到保护,以尽可能减少对其的滥用。在使用敏感变量之前进行类似检查通常是一个好主意,但在某些情况下由于各种原因不切实际或不可行。

我想说我更喜欢在你的情况下办理callee

答案 2 :(得分:0)

最好检查一下被调用的方法。对象应该保证一致的状态。它可以通过以下示例轻松说明:假设您实现了Money类:

public class Money {
    private final BigDecimal value;

    private Money(BigDecimal value) {
        this.value = value;
    }

    public static Money valueOf(BigDecimal value) {
        return new Money(value);
    }

    public BigDecimal getValue() {
        return value;
    }
}

合同规定货币价值必须为正数。因此,如果您将责任传递给客户端以检查用于构建Money的值是否为正,那么您允许某人构建具有非正值的Money,那么您的Money对象不再可靠且代码难以维护