当前位置: 代码迷 >> java >> 如何简化此Java代码?
  详细解决方案

如何简化此Java代码?

热度:68   发布时间:2023-07-17 20:04:11.0

我正在为名为Spigot(spigotmc.org)的Minecraft服务器软件编写一些Java代码,而我刚刚编写了此代码。 目的是检查可变block每一侧,并检查墙壁标志,如您所见。 它只需要找到一个即可。 然后它将更新它,什么都不会。 我知道这段代码可以简化,但是目前我不知道如果不为条件语句中的代码制作一个全新的函数,那是我不想做的。 有没有更好的方式编写此条件?

// Get an attached sign
Block sign;
if ((sign = block.getRelative(BlockFace.NORTH)).getType() == Material.WALL_SIGN) {
    org.bukkit.block.Sign data = (Sign) sign.getState();
    data.setLine(1, "OFF");
    data.update();
} else if ((sign = block.getRelative(BlockFace.EAST)).getType() == Material.WALL_SIGN) {
    org.bukkit.block.Sign data = (Sign) sign.getState();
    data.setLine(1, "OFF");
    data.update();
} else if ((sign = block.getRelative(BlockFace.WEST)).getType() == Material.WALL_SIGN) {
    org.bukkit.block.Sign data = (Sign) sign.getState();
    data.setLine(1, "OFF");
    data.update();
} else if ((sign = block.getRelative(BlockFace.SOUTH)).getType() == Material.WALL_SIGN) {
    org.bukkit.block.Sign data = (Sign) sign.getState();
    data.setLine(1, "OFF");
    data.update();
}

也许是循环?

// Get an attached sign
Block sign;
BlockFace[] faces = new BlockFace[] {
    BlockFace.NORTH,
    BlockFace.EAST,
    BlockFace.WEST,
    BlockFace.SOUTH};

for(BlockFace face : faces) {
    if ((sign = block.getRelative(face)).getType() == Material.WALL_SIGN) {
        org.bukkit.block.Sign data = (Sign) sign.getState();
        data.setLine(1, "OFF");
        data.update();
        break;
    }
}

当您有很多选择要看时,这种方法效果很好。 另外,如果您在其他地方执行类似的逻辑,则一定要创建一个函数,所有具有相同需求的客户端都可以调用该函数!

根据原理,您需要重复使用重复的零件。 在您的示例中,除了面部之外,整个if块都是相同的。

  1. 将ifs替换为:

     List<BlockFace> blockFaces = Arrays.asList(BlockFace.NORTH, BlockFace.EAST, BlockFace.WEST, BlockFace.SOUTH); for (BlockFace face : blockFaces) { Sign sign = block.getRelative(face); if (sign.getType() == Material.WALL_SIGN) { org.bukkit.block.Sign data = (Sign) sign.getState(); data.setLine(1, "OFF"); data.update(); break; } } 
  2. 提取方法:

     private boolean updateAttachedSign(Block block, BlockFace face) { Sign sign = block.getRelative(face); if (sign.getType() == Material.WALL_SIGN) { org.bukkit.block.Sign data = (Sign) sign.getState(); data.setLine(1, "OFF"); data.update(); return true; } return false; } { boolean signIsUpdated = updateAttachedSign(block, BlockFace.NORTH) || updateAttachedSign(block, BlockFace.EAST) || updateAttachedSign(block, BlockFace.WEST) || updateAttachedSign(block, BlockFace.SOUTH); } 

第二种解决方案尽管通常是一种上乘的方法,但对于您的情况似乎有些复杂。 我会坚持第一个。

由编辑:

谨慎使用短路的条件式电容器。 请参阅这篇出色的文章,以了解

您的内部if范围始终相同,因此您可以在条件之间使用“或”命令:

// Get an attached sign
Block sign;
if (((sign = block.getRelative(BlockFace.NORTH)).getType() == Material.WALL_SIGN) 
 || ((sign = block.getRelative(BlockFace.EAST)).getType()  == Material.WALL_SIGN)
 || ((sign = block.getRelative(BlockFace.WEST)).getType()  == Material.WALL_SIGN)
 || ((sign = block.getRelative(BlockFace.SOUTH)).getType() == Material.WALL_SIGN)
    org.bukkit.block.Sign data = (Sign) sign.getState();
    data.setLine(1, "OFF");
    data.update();
}
  相关解决方案