Java - 获取/设置接收和返回“null”的方法

时间:2011-06-04 15:31:38

标签: java null get set

我是Java的初学者。为了训练目的,我正在尝试为自己建立一个国际象棋游戏应用程序。在我的班级案例中,这将用于实现我董事会的所有64个案例,我编写了获取/设置方法来查找案例实例中是否有一个帖子占用者。

我读到返回“null”是一种不好的做法,所以我抛出异常来表示案件是免费的。但是,我想知道如何将占用者的指针设置为“null”;我可以简单地将“null”作为参数调用此方法吗?

另外,可以接受/返回“null”是可以接受/良好的做法吗?

public Piece getOccupant(){
    if (this.occupant == null)
        throw new IllegalArgumentException(this.occupant + " is Empty");
    return this.occupant;
}
public void setOccupant(Piece newOccupant){
    this.occupant = newOccupant;
}

谢谢!

[更新]

感谢您的所有意见,想法,更正和建议。以下是此部分代码的更新版本,我对此感到满意,因为它有助于实现其目的(通过实践增加我的理解)。

/*
 * Modifiers of Occupant
 */
/**
 * Used to find if a Piece is located in this Cell
 * @return a Piece reference to the occupant.  Will send a 
 * null pointer if cell is empty
 */
public Piece getOccupant(){
    return this.occupant;
}
/**
 * Used to set a new occupant in the Cell.
 * @param newOccupant is a reference to a Piece instance, 
 * and should be set to null if the cell is emptied, or using
 * the method clear().
 */
public void setOccupant(Piece newOccupant){
    this.occupant = newOccupant;
}
/**
 * Used to verify if a Cell is empty of any occupant
 * @return true if cell is empty.
 */
public boolean isEmpty(){
    if(this.occupant == null)
        return true;
    return false;
}
/**
 * Free the cell of any occupant, if any were
 */
public void clear(){
    this.occupant = null;
}

6 个答案:

答案 0 :(得分:10)

董事会空缺的空间并非例外。它是正常的,对于大多数董事会来说都是如此。你不应该在这里抛出异常;只应针对意外事件抛出异常,这意外事件表示您尝试执行的操作存在严重问题。

您当然可以将null传递给setter(除了int / long之类的基本类型)。

向Space类添加一些方便的方法,一个isEmpty方法可能会更好:

public boolean isEmpty(){
   if (this.occupant == null) 
      return true;
   return false;
}

也许也是一个明确的方法

public void clear() {
    this.occupant = null;
}

通过这种方式,您不必测试getter结果的null,并且您不需要传递null来设置 - 这具有易于测试的额外好处,并创建一个有意义的API到你的太空课。

答案 1 :(得分:6)

如果你想禁止空值,你应该在setter方法上执行:

public void setOccupant(Piece occupant) {
  if (occupant == null) throw new NullPointerException("occupant");
  this.occupant = occupant;
}

请注意,有些人更喜欢抛出IllegalArgumentException。无论哪种方式,只要有人设置了禁止值,重点就是“快速失败”。

说完所有这些之后,国际象棋棋盘肯定会有空位,所以允许空位似乎更有意义。

我建议你阅读Josh Bloch的“Effective Java,2nd Edition”。

答案 2 :(得分:3)

您在哪里阅读该推荐内容?在我看来,返回null绝对没有错,只要null传达一些有用的信息并且没有表明严重的错误情况。在这种情况下,象棋单元格不包含一个片段是完全正常的,在这种情况下我绝对希望getOccupant()返回null。

答案 3 :(得分:1)

如果调用者知道NULL返回值,则被调用者返回NULL值并不错。

答案 4 :(得分:1)

您应该创建一个类“Empty”,“None”,“Void”,类似于这样的类,而不是返回null或抛出异常,您将分配给所有空的Case。

答案 5 :(得分:0)

小建议 不需要if块,只需返回表达式的输出

即可简化代码
public boolean isEmpty(){
    return this.occupant == null
}