使用类级变量的Switch Case语句



如何使用类级变量的switch case语句。

@Value("${user.name}")
private static final String userName = "xyz";
public static void main(String[] args) {
String nn = "xyz";
switch (nn) {
case userName:
System.out.println("It Works!!");
}
}

在上面的例子中,我有一个名为"userName"的类级变量,它从属性文件中检索值。要在switch case语句中使用此字段,我必须将其设为最终字段并赋值,但它不执行case语句。如何在switchcase语句中使用类级变量?

它不会执行您的case语句,因为您的切换变量nn的值是"abcd",而在您的case变量userName的"xyz"中,它正在查找"abcd"case。

case userName:中,表达式(userName(必须是(编译时(常量表达式

如果userName是这样声明的:

private static final String userName = "xyz";

则CCD_ 4是(编译时(常数表达式。

但是,如果String变量(如userName(不是final,或者它有一个空的初始值设定项,或者它被初始化为方法调用的结果。。。或者其他一些事情。。。那么它就不是一个(编译时(常量表达式。

阅读JLS 15.28,了解常数表达式的全套标准。


那么我该如何解决我的问题?我正在努力解决"认知复杂性"声纳问题,我正在为对象列表运行for循环,并根据for循环对象的元素设置一个新的对象变量。我不想使用if-else语句,这就是为什么我试图切换case语句,直到遇到这个问题。

现在我们开始讨论真正的问题!!

你需要的是比if/else链更简单的东西,但当字符串(例如单词(是动态的时仍然有效。Switch语句不起作用1

这里有一个想法:

private static HashMap<String, Something> map = new HashMap<>();
// populate map for each word.
// then
String word = ...
Something something = map.get(word);
if (something) {
// use it.
}

Something可以是自定义对象,也可以是函数对象类型。。。。这样您就可以用Lambda填充地图。

这种方法比(假设的(字符串switch语句更冗长,但性能应该大致相同。它是否更可读将取决于上下文和谁在阅读代码。

另一方面,忽略声纳警告可能更合适。Sonar基于一些相当粗糙的启发式方法,为您提供关于代码质量的建议。它不理解代码,也不理解人们(程序员(的想法。


1-。。。除非您生成源代码并在运行时对其进行编译。除非真的有必要,否则你应该避免这种复杂性

最新更新