package x;
//Enums may not be local. They must be "public enum".
public enum Direction {
NORTH, SOUTH, EAST, WEST;
}
//----------------
import x.Direction;
/**
<P>{@code java EnumXmpl}</P>
**/
public class EnumXmpl {
public static final void main(String[] igno_red) {
}
public boolean doFoo(Direction e_dir) {
if (e_dir == Direction.NORTH) {
// do foo NORTH
}
if (e_dir == Direction.SOUTH) {
// do foo SOUTH
}
if (e_dir == Direction.EAST) {
// do foo EAST
}
if (e_dir == Direction.WEST) {
// do foo WEST
}
throw new IllegalArgumentException(" illegal direction " + e_dir);
}
}
沒有例外,這將不編譯。你會得到一個missing return statement
錯誤。使用這種設計,最好拋出一個IllegalStateException
,因爲它會表明一個更大的問題,而不僅僅是一個錯誤的參數被髮送 - 它意味着出了問題,比如在不知情的情況下更新和重新編譯枚舉。
你可以將其更改爲這個
public boolean doFoo(Direction e_dir) {
if (e_dir == Direction.NORTH) {
// do foo NORTH
}
if (e_dir == Direction.SOUTH) {
// do foo SOUTH
}
if (e_dir == Direction.EAST) {
// do foo EAST
}
// do foo WEST
}
你也可以做一個開關由@Teo和@Makoto
一種替代方法是重新定義爲每個方向的特定功能的枚舉的建議:
package x;
//Enums may not be local. They must be "public enum".
public enum DirectionEnumWithDeltas {
NORTH(new NorthFunctionality()),
SOUTH(new SouthFunctionality()),
EAST(new EastFunctionality()),
WEST(new WestFunctionality());
private final DirectionalFunctionality df;
DirectionEnumWithDeltas(DirectionalFunctionality d_f) {
if(d_f == null) {
throw new NullPointerException("d_f");
}
df = d_f;
}
public boolean doDirectionalStuff(int i_distance) {
return df.doDirectionalStuff(i_distance);
}
}
abstract class DirectionalFunctionality {
abstract boolean doDirectionalStuff(int i_distance);
}
class NorthFunctionality extends DirectionalFunctionality {
public boolean doDirectionalStuff(int i_distance) {
//...
return true;
}
}
class SouthFunctionality extends DirectionalFunctionality {
public boolean doDirectionalStuff(int i_distance) {
//...
return true;
}
}
class EastFunctionality extends DirectionalFunctionality {
public boolean doDirectionalStuff(int i_distance) {
//...
return true;
}
}
class WestFunctionality extends DirectionalFunctionality {
public boolean doDirectionalStuff(int i_distance) {
//...
return true;
}
}
現在你的函數可以被重新定義爲
public boolean doFoo(DirectionEnumWithDeltas e_dir) {
try {
return e_dir.doDirectionalStuff(3);
} catch(NullPointerException npx) {
throw new NullPointerException("e_dir");
}
}
爲什麼你會認爲有東西需要更換? –
爲什麼不使用實際的'Enum'作爲方法參數?這將防止傳遞任何無效信息。 –
關於如何處理錯誤情況沒有「要求」 - 您可以拋出異常,返回true/false或其他任何內容 - 只要嘗試使其與您的其他代碼處理類似情況的方式保持一致,並確保行爲被記錄。 – Krease