[英]What to do with fields that can only be assigned non-null values after the object is created (Java)
假设我正在做一个游戏:
public class Game {
Board board;
public ArrayDeque<Player> players;
//Players can have 'knights' and the one with the largest number
//is referenced by the game.
public Player playerWithLargestArmy;
...
}
在一开始,像这样的游戏初始化时,没有玩家可以拥有最大的军队(玩家只有一定数量的骑士后,才拥有“军队”)。 我想为playerWithLargestArmy分配一个值,但是我不确定。 我也不想使用null
因为我可以留下隐式赋值来做到这一点(而且无论如何,使用null都是不好的做法)。
我正在寻找可以向我解释如何解决此问题的人。 我查找了工厂和建筑商,但不确定他们是否会处理这种延迟的任务。 对于上下文,每个玩家都有一个int字段,用于指定他们拥有多少个骑士。
我可以用一个布尔值来解决这个问题,每个布尔值都说明他们是否拥有最大的军队,但随后您需要遍历这些球员以找到该球员,这并不理想。 就我而言,即使这不是一个巨大的牺牲,我仍然想知道以供将来参考。
对于这种情况,有java.util.Optional<T>
类。
它具有isPresent()
和get()
(以及其他几种方法),使您能够检查对象是否存在并获取基础对象的实例。
例子
宣言
Optional<Player> playerWithLargestArmy = Optional.empty();
价值分配
playerWithLargestArmy = Optional.of(newValue);
价值用途
if(playerWithLargestArmy.isPresent()) {
Player p = playerWithLargestArmy.get();
}
甚至更好
playerWithLargestArmy.map(p -> doSomethingWithIt(p));
仅在存在值的情况下才会调用doSomethingWithIt
。
空对象模式https://en.wikipedia.org/wiki/Null_Object_pattern
public class Army {
public static final Army NullArmy = new Army(0);
private int size;
public Army(int size) {
this.size = size;
}
}
现在,当您创建新的Army时,只需将初始值设置为Army.NullArmy。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.