【问题标题】:Can I make this switch statement any smaller? Preferably with a for loop [closed]我可以让这个 switch 语句更小吗?最好使用for循环[关闭]
【发布时间】:2021-09-16 19:59:04
【问题描述】:

有没有办法让这个更小,我尝试使用 for 循环,但无法为每个可能的类型创建一个随机实例。

Random randFireworkEffect = new Random(5);
switch(randFireworkEffect.nextInt()) {
    case 0:
        e = FireworkEffect.builder().flicker(true).withColor(c).withFade(c).with(Type.BALL).trail(true).build();
        break;
    case 1:
        e = FireworkEffect.builder().flicker(true).withColor(c).withFade(c).with(Type.BALL_LARGE).trail(true).build();
        break;
    case 2:
         e = FireworkEffect.builder().flicker(true).withColor(c).withFade(c).with(Type.BURST).trail(true).build();
        break;
    case 3:
         e = FireworkEffect.builder().flicker(true).withColor(c).withFade(c).with(Type.CREEPER).trail(true).build();
        break;
    case 4:
         e = FireworkEffect.builder().flicker(true).withColor(c).withFade(c).with(Type.STAR).trail(true).build();
        break;
}

【问题讨论】:

  • 是的,要短得多,但这里我们讨论的是代码审查
  • 你有很多代码重复。所有这些情况之间唯一不同的是您选择的 Type 枚举。您应该将其放入变量中,然后在 switch 之后执行其余代码。所以Type type = switch(...) { case 0 -> Type.BALL; case 1 -> ... }; 然后...with(type)...
  • 您只是想将int 转换为FireworkEffect.Type 枚举,所以this 应该会有所帮助。根本不需要 switch 语句或循环。
  • 我投票结束这个问题,因为它属于Code Review

标签: java bukkit


【解决方案1】:

你可以使用.values()

Random randFireworkEffect = new Random();
e = FireworkEffect.builder()
        .flicker(true)
        .withColor(c)
        .withFade(c)
        .with(FireworkEffect.Type.values([randFireworkEffect.nextInt(5)])
        .trail(true)
        .build();

【讨论】:

  • 我尝试了一个 for 循环来遍历 Type.values() 但找不到随机选择效果的方法,有没有可以提供类似信息的论坛?
  • @RainDragonInk 我修复了我的代码,问题是您使用相同的随机种子。您使用 5 作为种子而不是最大值(我只是复制了您的代码,因为您要求制作更小)
【解决方案2】:

迭代.values() 不是最优的。最好使用预填充哈希图

Map<Integer, Type> typeMap = new HashMap<>();
typeMap.put(0, Type.BALL);
typeMap.put(1, Type.BALL_LARGE);
// ... other options

Random randFireworkEffect = new Random(5);
e = FireworkEffect.builder()
        .flicker(true)
        .withColor(c)
        .withFade(c)
        .with(typeMap.get(randFireworkEffect.nextInt()))
        .trail(true)
        .build();

【讨论】:

  • 那么为什么不预先填充一个列表呢?
  • 如果你使用预填充数组,你可能会使用.values()。还使用.values() 5 元素的枚举它不是太慢。
  • @OleV.V.因为不能保证给定的整数与 Type 枚举项的序数相关。
  • 我们是否假设randFireworkEffect.nextInt() 返回int?我不明白你的论点,你可能想解释一下。
  • @OleV.V. @Ofek 我的意思是你不能从 OP 的代码示例中得出结论,类型项目的顺序是准确的(BALL、BALL_LARGE、BURST、CREEPER、STAR),因此例如Type.values()[0]BALLType.values()[1]BALL_LARGE 等。但是在接受的答案中假定此顺序
【解决方案3】:

要做到这一点:

Random randFireworkEffect = new Random(5);
                                switch(randFireworkEffect.nextInt()) {
                                case 0:
                                    e = FireworkEffect.builder().flicker(true).withColor(c).withFade(c).with(Type.BALL).trail(true).build();
                                    break;
                                case 1:
                                    e = FireworkEffect.builder().flicker(true).withColor(c).withFade(c).with(Type.BALL_LARGE).trail(true).build();
                                    break;
                                case 2:
                                     e = FireworkEffect.builder().flicker(true).withColor(c).withFade(c).with(Type.BURST).trail(true).build();
                                    break;
                                case 3:
                                     e = FireworkEffect.builder().flicker(true).withColor(c).withFade(c).with(Type.CREEPER).trail(true).build();
                                    break;
                                case 4:
                                     e = FireworkEffect.builder().flicker(true).withColor(c).withFade(c).with(Type.STAR).trail(true).build();
                                    break;

更短,看看所有这些行之间到底有什么区别,就是类型:

Type[] types = new Type[]{Type.BALL, Type.BALL_LARGE, Type.BURST, Type.CREEPER, Type.STAR};
Random effect = new Random(5);
e = FireworkEffect.builder().flicker(true)
    .withColor(c).withFade(c)
    .with(types[effect.nextInt()])
    .trail(true).build();

是的,你可以把它放在一个循环中,设置更多的值。

【讨论】:

  • 你可以拨打Type.values()
  • @Ofek 我已经调整了类型。至于 values(),因为我不熟悉这个 Type 类,所以我不打算赌它:)
  • 它来自 spigot:hub.spigotmc.org/javadocs/bukkit/org/bukkit/…(我也熟悉这个,但它看起来像 spigot 所以我搜索了它)
【解决方案4】:

有以下最佳做法可以避免虚假案例陈述。首先应该创建一些预定义关系的映射。然后您就可以在运行时从中获取值。

private static final Map<Integer, Type> typeMap = new Hashmap<>();

static {
  typeMap.put(0, Type.BALL);
  typeMap.put(1, Type.BALL_LARGE);
  typeMap.put(2, Type.BURST);
  typeMap.put(3, Type.CREEPER);
  typeMap.put(4, Type.STAR);
}

public FireworkEffect getFireworkEffect() {
   Random randFireworkEffect = new Random(5);
   Type type = typeMap.get(randFireworkEffect);
   return FireworkEffect.builder()
          .flicker(true)
          .withColor(c)
          .withFade(c)
          .with(type)
          .trail(true)
          .build();
}

【讨论】:

  • 为什么不是数组?
  • 如果是整数数组当然可以。但我说的是当 ifs 和 case 替换为 map 时的整个原则。
猜你喜欢
  • 2019-06-17
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2017-07-24
  • 2021-07-17
  • 1970-01-01
  • 2020-03-26
相关资源
最近更新 更多