【问题标题】:What to do with fields that can only be assigned non-null values after the object is created (Java)创建对象后只能分配非空值的字段如何处理(Java)
【发布时间】:2017-03-11 16:35:56
【问题描述】:

假设我正在制作一个游戏:

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 字段,指定他们有多少骑士。

我可以为每个玩家使用一个布尔值来解决这个问题,说明他们是否拥有最大的军队,但是你需要遍历玩家来找到那个玩家,这并不理想。即使就我而言,这不是一个巨大的牺牲,我仍然想知道以供将来参考。

【问题讨论】:

  • 是的,我确实在堆栈溢出时查看了这个问题。找不到任何东西。不会问我有没有。
  • 什么时候使用null 成为“一种不好的做法”?
  • 您可能想查看空对象模式en.wikipedia.org/wiki/Null_Object_pattern
  • @DanielSoutar 但是,人们不应该从字面上理解这个哲学建议。在某些情况下,null 是正确的选择。
  • @DanielSoutar 我添加了一个包含示例的答案。但 Null Object 模式正好适合您的情况。

标签: java null variable-assignment factory builder


【解决方案1】:

这种情况有java.util.Optional&lt;T&gt; 类。

它具有 isPresent()get()(以及其他几个)方法,可让您检查对象是否存在并获取底层对象的实例。

示例

声明

 Optional<Player> playerWithLargestArmy = Optional.empty();

赋值

playerWithLargestArmy = Optional.of(newValue);

使用价值

if(playerWithLargestArmy.isPresent()) {
    Player p = playerWithLargestArmy.get();
}

甚至更好

playerWithLargestArmy.map(p -> doSomethingWithIt(p));

仅当值存在时才会调用doSomethingWithIt

【讨论】:

  • 在这种情况下你会解释如何使用它吗?
  • @takendarkk 你读懂了我的想法。但是talex,你能告诉我那个类是做什么的吗?
  • 添加了一些解释。您可以在JavaDoc 中找到更多信息
  • 添加使用示例。
  • @talex 这真的很方便!谢谢你。
【解决方案2】:

空对象模式 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.NullArmy。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2021-11-13
    相关资源
    最近更新 更多