Tag: switch statement

为什么我不能在Java中的switch语句中使用’continue’?

为什么会出现以下代码: class swi { public static void main(String[] args) { int a=98; switch(a) { default:{ System.out.println(“default”);continue;} case ‘b’:{ System.out.println(a); continue;} case ‘a’:{ System.out.println(a);} } System.out.println(“Switch Completed”); } } 给出错误: 继续循环

在很多情况下优化Java switch语句?

我目前正在使用switch语句来处理有大约20种不同情况的传入消息类型。 其中一些案例比其他案件更有可能发生数量级。 热点编译器是否能够优化检查案例的顺序以找到要执行的正确案例,或者我应该构建我的代码以便最常见的案例首先出现: switch(messageType) { case MOST_COMMON: // handle it break; … case LEAST_COMMON: // handle it break; } 所有案件都是互相排斥的。 我会更好地使用策略模式和消息类型的Map查找吗? 性能是关键问题,因为我每秒处理数千条消息,并且正在尝试减少对象创建和方法调用开销。 非常感谢, 克里斯 编辑:感谢指点。 messageType是一个具有较小值范围的int,因此看起来它将编译为“tableswitch”字节码,因此无需重新排序。 JVM规范的相关部分在http://java.sun.com/docs/books/jvms/second_edition/html/Compiling.doc.html#14942

开关的eclemma分支覆盖:错过了7个

我有这个交换机系统,我正在使用eclemma来测试分支机构的覆盖范围。 我们需要至少有80%的分支机构覆盖所有内容,所以我尽可能地尝试测试。 但是,eclemma告诉我这个交换机系统在分支覆盖范围方面没有经过全面测试。 pos = p.getCurrentPosition().substring(0, 1); switch (pos) { case “G”: goalkeepers++; break; case “D”: defense++; break; case “M”: midfield++; break; case “F”: offense++; break; case “S”: substitutes++; break; case “R”: reserves++; break; } 我使用简单的JUnit测试来解决这些问题。 仍然是eclemma将此标记为黄色并且说“错过了19个分支中的7个”。 我想说只有7种方法可以通过这个开关系统(6个个案+所有未定义)。 我尝试在堆栈溢出时搜索类似的问题。 他们中的一些人使用if / else进行完全覆盖的解决方案。 我不确定这是否是获得此保险的唯一方法。 任何人都可以解释所有这19个分支来自哪里以及我如何测试这些剩余的7个以获得100%的分支覆盖率?

在Java中切换语句

Java中的switch语句可能有多少种情况? 例如,如果我们检查一个整数,可能有多少个案例块?

为什么此代码中的枚举开关需要默认值?

通常,switch语句中不需要default。 但是,在以下情况下,代码只有在取消注释默认语句时才能成功编译。 任何人都可以解释原因吗? public enum XYZ {A,B}; public static String testSwitch(XYZ xyz) { switch(xyz) { case A: return “A”; case B: //default: return “B”; } }

如何处理多个条件?

在我使用任何编程语言的1个月经验中,我假设switch case条件将接受括号中的任何内容作为布尔检查thingamajig,即: || && 明白我的意思了吗? 就像是 char someChar = ‘w’; switch (someChar) { case (‘W’ ||’w’): System.out.println (“W or w”); } 可悲的是,似乎没有这样的方式。 我不能在switch case中进行布尔检查。 有办法解决吗? 顺便说一句,如果我听起来很混乱,非常抱歉。 我还不太清楚这种语言的所有名称:X 任何答案都赞赏

在java 7中切换忽略大小写

我正在做Java 7新function的POC。 我有代码在switch语句中使用String,它的工作原理。 我想让它在不区分大小写的情况下工作。 有没有办法在String上检查ignoreCase? package com.java.j7; public class Test { final private String _NEW =”NEW”; final private String _PENDING = “PENDING”; final private String _CLOSED = “CLOSED”; final private String _REJECTED =”REJECTED”; public static void main(String… strings){ Test j = new Test(); j.processItem(“new”); j.processItem(“pending”); j.processItem(“closed”); j.processItem(“rejected”); } void processItem(String s){ switch (s) { case […]

有没有人不同意这句话:“使用开关是不好的OOP风格”?

我已经看到它写在stackoverflow上的多个线程/注释中,使用switch只是糟糕的OOP风格。 就个人而言,我不同意这一点。 在许多情况下,您无法将代码(即方法)添加到要打开的enum类中,因为您无法控制它们,也许它们位于第三方jar文件中。 还有其他一些情况,将function放在枚举本身是一个坏主意,因为它违反了一些关注点分离的考虑因素,或者它实际上是其他东西以及枚举的函数。 最后,交换机简洁明了: boolean investable; switch (customer.getCategory()) { case SUB_PRIME: case MID_PRIME: investible = customer.getSavingsAccount().getBalance() > 1e6; break; case PRIME: investible = customer.isCeo(); break; } 我不是在捍卫每一个switch用途,我不是说它总是要走的路。 但在我看来,像“Switch是代码味道”这样的陈述是错误的。 还有其他人同意吗?

break和switch似乎执行所有case语句

在Java和Eclipse(Kempler)的最新稳定版本中,输入以下代码并执行它,假设包和类名存在: package some_package; public class what_the_heck { public static void main(String[] args) { int p = 2; int x = 1; switch(p){ case (1): x–; case (2): x = 2; case (3): x = 3; default: x++; } System.out.println(x); } } 这打印值4.最初,我认为它应该打印2因为我认为即使没有break语句,每段代码仍然保存在case语句中。 现在我认为问题在于如何编译。 例如,我目前的信念是内部布尔值跟踪case语句是否等于该值。 如果是,那么布尔值为true,并且所有case语句都将被视为true,直到找到中断为止。 这是有道理的,但我仍然想知道这背后是否有其他原因,或者我的假设是完全错误的。

麻烦制造多态失败那些开关/案例陈述

继续前面的问题( 这里和这里 ),我实现了一个基本的命令模式,创建了我的命令类并编码到一个接口,所以当使用任何命令时,调用execute()方法。 但是,我仍然发现自己无法动摇这些案例陈述:我正在读取主/决定字符串中的每个字符,字符串由随机的,重复的字符A,B,C或D组成,然后我检索相关的实现来自地图的命令并调用其execute方法。 我的设计是这样的: public interface Command { void execute(); } public class CommandA implements Command{ //implements execute() method } private Map myMap= new HashMap(); myMap.put(“A”, new CommandA); myMap.put(“B”, new CommandB); myMap.put(“C”, new CommandC); myMap.put(“D”, new CommandD); 但是,当我阅读每条指令时,我再次诉诸案例陈述: switch(instructionFromString){ case ‘A’:{myMap.get(“A”).execute(); break;} case ‘B’:{myMap.get(“B”).execute(); break;} case ‘C’:{myMap.get(“C”).execute(); break;} case ‘D’:{myMap.get(“D”).execute(); break;} 显然,在某种程度上我设法击败了多态性对案例陈述的优势。 它可能是我选择存储命令的那种数据结构吗? 它很可能是一个永久的数据结构,只需从中提取这些命令。 […]