在no-ops的情况下返回布尔值/值而不是null是一个好习惯吗?

时间:2014-01-12 01:59:27

标签: java design-patterns boolean

在查看DirectedGraph.java中的addNode代码后,进行了此观察。编码器使用true和false来区分no-op和op。一个类似的例子是下面的代码定制,只是为了轻松地提出我的问题。建议/良好做法是返回布尔值以区分操作和操作中的无操作以提高代码客户端的可见性吗?

public class FreeMain {

    private List<Integer> fooList;

    FreeMain ( ) {  }

    /**
     * Lazy init - either set a value of no-op.
     * 
     * @param barList
     */
    public void putList(List<Integer> barList) {
        if (this.fooList == null) {
            this.fooList = barList;
        }
    }



    /**
     * Boolean returned as an indication to the user of operation status
     * 
     * @param barList 
     * @return true if putLists sets the value, false is no-op.
     */
    public boolean putListWithBoolean(List<Integer> barList) {
        if (this.fooList == null) {
            this.fooList = barList;
            return true;
        }
        return false;
    }
}

1 个答案:

答案 0 :(得分:3)

我会这样设置,在这种情况下putList的责任是告诉你是否通过返回布尔值来接受你尝试放置的列表?在我看来没有,这是因为putList应该只处理替换列表指针的单个模块而不返回一些东西。

如果您确实想知道条件是否被授予(或者对于可能发生的任何异常行为),请使用例外。然后在使用putList时(使用try-catch块)将这些异常捕获到main中,然后执行任何操作。

例如:

public void putList(List<Integer> barList) throws new MyListException{
    if (this.fooList == null) {
        this.fooList = barList;
    } else {
        throw new MyListException("The pointer of fooList can not be changed because the fooList is not null");
    }
}

public class MyListException extends Exception {
    public MyListException(String s) {
        super(s);
    }
}

另一方面,该方法返回true / false的情况是它应该实际处理该模块并通过测试条件确定是否接受列表。因此,方法名称将为'isListAccepted()'(不需要参数,因为它不起任何作用)。然而,在java中,注意到(即See LinkedList click here)有时像公共布尔加法(E e)这样的方法返回true / false。这是因为这些方法是在集合接口下实现的,并且集合的工作方式有一些先决条件。此外,在这种情况下,oracle文档也说:

  

public boolean add(E e)确保此集合包含指定的元素   (可选操作)。如果此集合由于更改而返回,则返回true   呼叫。 (如果此集合不允许重复,则返回false   已包含指定的元素。)

     

如果集合因任何原因拒绝添加特定元素   除了它已经包含元素,它必须抛出一个   异常(而不是返回false)。

基于此,我相信这些操作会在使用之后处理告诉您集合是否已经更改的模块,而不是添加元素(即使它们在某些情况下也是如此)。

一个例子:

private boolean isListAccepted() {
    return this.fooList == null;
}

最后,既然我也不确定你的意思是什么“而不是无操作时的null”,我会说:当你使用putList(..)并且条件没有被授予时,它不会返回null,而是它什么都不做。但是,在这种情况下,总是优选使用Exceptions,因为我已经演示了(在第一个示例中),以便在您期望putList()实际替换指针的情况下,您将知道出了什么问题。这是因为你不总是有机会花时间搜索代码来理解出了什么问题。这对你提供的代码示例并不重要,因为它很简单,但是如果你有一个更复杂的putList并且多个东西可能会出错呢?

总的来说,我不能说putListWithBoolean()是不是很糟糕,因为它取决于它的使用方式(如java示例所示),而没有异常的putList()可以被认为是一种不好的做法,因为你的课程总是那么简单,很多事情都可能出错,所以你最好知道出了什么问题以及在哪里。