我是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;
}
答案 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)
public boolean isEmpty(){
return this.occupant == null
}