问题描述
我正在为名为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();
}
1楼
也许是循环?
// 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;
}
}
当您有很多选择要看时,这种方法效果很好。 另外,如果您在其他地方执行类似的逻辑,则一定要创建一个函数,所有具有相同需求的客户端都可以调用该函数!
2楼
根据原理,您需要重复使用重复的零件。 在您的示例中,除了面部之外,整个if块都是相同的。
将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; } }
提取方法:
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); }
第二种解决方案尽管通常是一种上乘的方法,但对于您的情况似乎有些复杂。 我会坚持第一个。
由编辑:
谨慎使用短路的条件式电容器。 请参阅这篇出色的文章,以了解
3楼
您的内部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();
}