在增强型交换机情况下不需要执行任何操作。

9

我有下面这个改进的switch case语句:

@Override
public MultivaluedMap<String, String> update(MultivaluedMap<String, String> incomingHeaders,
        MultivaluedMap<String, String> clientOutgoingHeaders) {

    switch (authMethod) {
        case BASIC -> clientOutgoingHeaders.add("Authorization", basicAuth("admin", "admin"));
        case BEARER -> clientOutgoingHeaders.add("Authorization", "Bearer" + " " + getAccessTokenFromKeycloak());
        case SKIP -> System.out.println(); // How can I remove this?
    }
    return clientOutgoingHeaders;
}

其中authMethod是一个

enum AuthMethod{
        BASIC,
        BEARER,
        SKIP
    }

如果authMethodSKIP,我只希望代码什么也不做。我不想移除这个case。
我知道我可以以其他不同的方式解决这个问题,但我很好奇是否可以通过增强版的switch来实现。
我也知道我可以删除SKIP case,但这不是我想要的,因为我想明确表明在该情况下SKIP不会执行任何操作。
这就是我尝试过的。
case SKIP -> {};
case SKIP -> ();

在增强型的switch语句中,如何什么都不做?


1
我认为对于任何有能力的Java程序员来说,如果在switch语句中没有相应的case,那么它就什么也不做已经是显而易见的了。你所描述的情况类似于在if语句上放置一个空的else子句;没有人会提倡这样做。 - Robert Harvey
当您尝试使用case SKIP -> {};时发生了什么? - Robert Harvey
@RobertHarvey IDE(IntelliJ)报错:期望出现“case”、“default”或“}”。我已经尝试过了。 - alexander
1
@RobertHarvey:“对于任何有能力的Java程序员来说,如果在switch语句中没有相应的case,那么它就什么也不做”这也可能意味着有人引入了新的枚举常量,但忘记调整相应的switch语句以处理新的情况。这反过来会导致运行时错误,而最好在编译时捕获它们。 - Cryptor
1个回答

17

这离成功很近了!

case SKIP -> {};

你只多加了一个分号!删除它就可以编译了!

case SKIP -> {}

查看Java语言规范SwitchRule的语法:

SwitchStatement:
switch ( Expression ) SwitchBlock

SwitchBlock:
{ SwitchRule {SwitchRule} } 
{ {SwitchBlockStatementGroup} {SwitchLabel :} }

SwitchRule:
SwitchLabel -> Expression ; 
SwitchLabel -> Block 
SwitchLabel -> ThrowStatement

注意,如果是表达式,例如您的 `add` 函数调用,需要在其后加上一个分号。如果使用块(如 `{}`),则不应添加分号。

1
谢谢!我习惯于到处放置; :D顺便说一句:像 doNothing 这样什么都不做的静态方法,以及对它的静态导入也非常好看。 - alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接