如何简化这个Java代码?

如何简化这个Java代码?,java,conditional,simplify,Java,Conditional,Simplify,我正在为一个名为spiget(spigotmc.org)的Minecraft服务器软件编写一些Java代码,我刚刚编写了这个。目标是检查变量块的每一侧,并检查您可以看到的墙标志。它应该只需要找到一个。然后它会更新它等等。我知道这段代码可以简化,但目前我不知道如何在条件中为代码创建一个完整的新函数,我不想这样做。有没有更好的方法来编写这个条件语句 // Get an attached sign Block sign; if ((sign = block.getRelative(BlockFace.

我正在为一个名为spiget(spigotmc.org)的Minecraft服务器软件编写一些Java代码,我刚刚编写了这个。目标是检查变量
块的每一侧
,并检查您可以看到的墙标志。它应该只需要找到一个。然后它会更新它等等。我知道这段代码可以简化,但目前我不知道如何在条件中为代码创建一个完整的新函数,我不想这样做。有没有更好的方法来编写这个条件语句

// 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;
        }
    }
    
  • 第二个解决方案,尽管总体上是优越的方法,但对于您的案例来说似乎有点过于复杂。我会坚持第一个

    编辑人:

    谨慎使用短路条件句。请参阅这篇优秀的文章,根据您需要重用重复部件的原则,这篇文章的意义何在。在您的示例中,除了面之外,整个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;
        }
    }
    
  • 第二个解决方案,尽管总体上是优越的方法,但对于您的案例来说似乎有点过于复杂。我会坚持第一个

    编辑人:


    谨慎使用短路条件句。请参阅这篇关于这有何意义的优秀文章

    如果您的代码正在工作,并且您只是想寻求更好/更简单的实现方法,那么您应该在上问这个问题,而不是stackoverflow。是的,我“非常肯定”它能工作。:)谢谢如果您的代码正在运行,并且您只是要求使用更好/更简单的方法来实现它,那么您应该在上问这个问题,而不是stackoverflow。是的,我“非常肯定”它会运行。:)谢谢,谢谢!这看起来像是我的目标!虽然该代码在逻辑上等同于OPs,但由于短路评估起作用,因此目前尚不清楚。非常重要的是,在第一次成功匹配后,立即停止对
    符号的赋值;否则,
    符号
    将以错误的值结束。@dasblinkenlight,您是对的,但在这种情况下,它的工作原理与before@RoyShmuli是的,会的。由于OP的代码看起来像是由一个相对较新的人编写的(除了在
    if
    中赋值之外,这是一个中级技巧),他可能会受益于对这一特定点的更多解释。这是一个短路条件语句的示例,在Java中完全有效。我看到的问题是if语句中仍然有相当多的代码!谢谢这看起来像是我的目标!虽然该代码在逻辑上等同于OPs,但由于短路评估起作用,因此目前尚不清楚。非常重要的是,在第一次成功匹配后,立即停止对
    符号的赋值;否则,
    符号
    将以错误的值结束。@dasblinkenlight,您是对的,但在这种情况下,它的工作原理与before@RoyShmuli是的,会的。由于OP的代码看起来像是由一个相对较新的人编写的(除了在
    if
    中赋值之外,这是一个中级技巧),他可能会受益于对这一特定点的更多解释。这是一个短路条件语句的示例,在Java中完全有效。我看到的问题是if语句中仍然有相当多的代码+1建议您的第二种方法更优越,因为它确保调用者没有做太多的主题逻辑。一般规则是,每个方法都有一个非常特定的功能,并且不会过度扩展其工作负载。初级开发人员的一个常见错误是创建了大量的单片方法,这些方法做得太多,经常在其他地方一次又一次地复制代码,因为他们没有将代码保持模块化+1,因为他们认为第二种方法更优,因为它确保调用方没有做太多的主题逻辑。一般规则是,每个方法都有一个非常特定的功能,并且不会过度扩展其工作负载。初级开发人员的一个常见错误是创建了大量的单片方法,这些方法做得太多了,经常在别处一次又一次地复制代码,因为他们没有将代码模块化