如何简化这个Java代码?
我正在为一个名为spiget(spigotmc.org)的Minecraft服务器软件编写一些Java代码,我刚刚编写了这个。目标是检查变量如何简化这个Java代码?,java,conditional,simplify,Java,Conditional,Simplify,我正在为一个名为spiget(spigotmc.org)的Minecraft服务器软件编写一些Java代码,我刚刚编写了这个。目标是检查变量块的每一侧,并检查您可以看到的墙标志。它应该只需要找到一个。然后它会更新它等等。我知道这段代码可以简化,但目前我不知道如何在条件中为代码创建一个完整的新函数,我不想这样做。有没有更好的方法来编写这个条件语句 // Get an attached sign Block sign; if ((sign = block.getRelative(BlockFace.
块的每一侧
,并检查您可以看到的墙标志。它应该只需要找到一个。然后它会更新它等等。我知道这段代码可以简化,但目前我不知道如何在条件中为代码创建一个完整的新函数,我不想这样做。有没有更好的方法来编写这个条件语句
// 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();
}
您的内部if作用域始终相同,因此您可以在以下条件之间使用“or”命令:
// 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();
}
您的内部if作用域始终相同,因此您可以在以下条件之间使用“or”命令:
// 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();
}
也许是一个循环
// 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;
}
}
当您有很多选择时,这种方法很有效。另外,如果您在其他地方执行类似的逻辑,那么一定要创建一个具有相同需求的所有客户端都可以调用的函数 可能是一个循环
// 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块是相同的
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;
}
}
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;
}
}
谨慎使用短路条件句。请参阅这篇关于这有何意义的优秀文章如果您的代码正在工作,并且您只是想寻求更好/更简单的实现方法,那么您应该在上问这个问题,而不是stackoverflow。是的,我“非常肯定”它能工作。:)谢谢如果您的代码正在运行,并且您只是要求使用更好/更简单的方法来实现它,那么您应该在上问这个问题,而不是stackoverflow。是的,我“非常肯定”它会运行。:)谢谢,谢谢!这看起来像是我的目标!虽然该代码在逻辑上等同于OPs,但由于短路评估起作用,因此目前尚不清楚。非常重要的是,在第一次成功匹配后,立即停止对
符号的赋值;否则,符号
将以错误的值结束。@dasblinkenlight,您是对的,但在这种情况下,它的工作原理与before@RoyShmuli是的,会的。由于OP的代码看起来像是由一个相对较新的人编写的(除了在if
中赋值之外,这是一个中级技巧),他可能会受益于对这一特定点的更多解释。这是一个短路条件语句的示例,在Java中完全有效。我看到的问题是if语句中仍然有相当多的代码!谢谢这看起来像是我的目标!虽然该代码在逻辑上等同于OPs,但由于短路评估起作用,因此目前尚不清楚。非常重要的是,在第一次成功匹配后,立即停止对符号的赋值;否则,符号
将以错误的值结束。@dasblinkenlight,您是对的,但在这种情况下,它的工作原理与before@RoyShmuli是的,会的。由于OP的代码看起来像是由一个相对较新的人编写的(除了在if
中赋值之外,这是一个中级技巧),他可能会受益于对这一特定点的更多解释。这是一个短路条件语句的示例,在Java中完全有效。我看到的问题是if语句中仍然有相当多的代码+1建议您的第二种方法更优越,因为它确保调用者没有做太多的主题逻辑。一般规则是,每个方法都有一个非常特定的功能,并且不会过度扩展其工作负载。初级开发人员的一个常见错误是创建了大量的单片方法,这些方法做得太多,经常在其他地方一次又一次地复制代码,因为他们没有将代码保持模块化+1,因为他们认为第二种方法更优,因为它确保调用方没有做太多的主题逻辑。一般规则是,每个方法都有一个非常特定的功能,并且不会过度扩展其工作负载。初级开发人员的一个常见错误是创建了大量的单片方法,这些方法做得太多了,经常在别处一次又一次地复制代码,因为他们没有将代码模块化