繁体   English   中英

创建对象后只能分配非空值的字段怎么办(Java)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM