如何使用类级变量的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-。。。除非您生成源代码并在运行时对其进行编译。除非真的有必要,否则你应该避免这种复杂性