我的认为switch机构 都没if 好用哦
switch 只能判断 选择
比如说 switch(name):
cese 1: case 2:
可是要怎么来判断字符串的呢!!
请大家说说switch有什么好处
switch 只能判断 选择
比如说 switch(name):
cese 1: case 2:
可是要怎么来判断字符串的呢!!
请大家说说switch有什么好处
解决方案 »
- JAXP是如何在底层工作的
- Runtime.getRuntime().exec("msconfig")在eclipse下运行不出来?
- java double型问题,有一便入
- 请教:如何在table上只显示一句话,而不受表格限制?
- c++转换到java
- 怎么让 HashMap的 .values().ToArray() 按key值排序输出?
- 问一个多线程的问题?
- 为什么我的tomcat出现死循环错误
- 怪现象:::在不使用JRE的环境下,怎样在浏览器中显示JAPPLET的东东(急!!)
- 急急急 ! 大一新生 实验报告 jmf 的控制条怎么做啊?
- 谁能帮我改一下这个画图工具,谢谢!
- 谁能帮我解决这个问题,很气人。
如果传入的是一个参数,并且参数可以在某些范围之内用switchcase的话,可以省去很多if。。else
有的正好用到了判断数字的地方用switch case 显然要比if else要强. 比如rcp中通过下标判断列名的时候....
楼主别着急,我那次看介绍jdk7的文章,jdk7可以用switch判断字符串,但是现在的还不能判断字符串,呵呵 ,等着吧。
对于这个说法 我不是很赞同 虽然很多书里是这么说的但只是针对某些情况 并不是所有的情况都要考虑多态如果所有switch都用多态来代替 那么switch这个关键字就没有存在的意义了另一方面 switch可以完全用if else来代替如果switch必须用多态来代替 那么if else也用多态来代替吧 这个说法显然不成立
没说所有的,而是大多数的。举个例子吧,针对一个日志系统,我们有如下的接口定义:01. public interface Log {
02.
03. public void trace(String message, Object... args);
04. public void trace(String message, Throwable throwable, Object... args);
05.
06. public void debug(String message, Object... args);
07. public void debug(String message, Throwable throwable, Object... args);
08.
09. public void info(String message, Object... args);
10. public void info(String message, Throwable throwable, Object... args);
11.
12. public void warn(String message, Object... args);
13. public void warn(String message, Throwable throwable, Object... args);
14.
15. public void error(String message, Object... args);
16. public void error(String message, Throwable throwable, Object... args);
17.
18. public void fatal(String message, Object... args);
19. public void fatal(String message, Throwable throwable, Object... args);
20.
21. public void log(Level level, Object obj, Object... args);
22. public void log(Level level, Object obj, Throwable throwable, Object... args);
23.
24. public boolean isTraceEnabled();
25. public boolean isDebugEnabled();
26. public boolean isInfoEnabled();
27. public boolean isWarnEnabled();
28. public boolean isErrorEnabled();
29. public boolean isFatalEnabled();
30. public boolean isEnabled(Level level);
31. }Level 是一个 enum 类,其中有 TRACE,DEBUG,INFO,WARN,ERROR,FATAL 等数据,先不看接口中其他代码的实现,我们仅仅研究 21, 22, 30 行的代码实现。如果第 21 行传入的 Level 是一个 Level.DEBUG 的话,那我们理所当然的应该调用 06 行的方法来做这件事情。有很多人可能会在 21,22,30 行的代码实现中使用 if...else 或者是 switch...case 来判断 Level 具体的值,再根据不同的值调用不同的方法。如果今后需要再增加一种日志级别的话,那我们必须更改 21,22,30 行的实现方法,如果这样的话就将打破面向对象程序设计中一个很重要的原则,即“开-闭原则”,“开-闭原则”的思想是:不要去改动已经能正经运行的代码,只能通过新增加实现类来达到目的,所谓的“开”指的是代码对增加实现是开放的,所谓的“闭”指的是对既有代码的修改是关闭的。为了能使用多态来取代 if...else 或者 switch...case 来实现 21,22,30 行的方法,为了对于日后的扩展,我们可以这样做:class LogImpl implements Log { ...... public void log(Level level, String message, Object... args) {
level.log(this, message, args);
} public void log(Level level, String message, Throwable throwable, Object... args) {
level.log(this, message, throwable, args);
}
public boolean isEnabled(Level level) {
return level.isEnabled(this);
}
}上面这段是 LogImpl 的部分代码,可以注意一下,这个实现类并不是 public 的,主要是为了对外隐藏实现,大家或许注意到了 Log 接口是 public 的。LogImpl 其他的代码省略了,这里只给出了接口中 20,21,30 行方法的实现,注意看一下是如何调用的。之后来看一下 Level 这个 enum 进行代码重构后是怎么样的:public enum Level { TRACE {
public boolean isEnabled(Log log) {
return log.isTraceEnabled();
}
public void log(Log log, String message, Object... args) {
log.trace(message, args);
}
public void log(Log log, String message, Throwable throwable, Object... args) {
log.trace(message, throwable, args);
}
}, DEBUG {
public boolean isEnabled(Log log) {
return log.isDebugEnabled();
}
public void log(Log log, String message, Object... args) {
log.debug(message, args);
}
public void log(Log log, String message, Throwable throwable, Object... args) {
log.debug(message, throwable, args);
}
}, INFO {
public boolean isEnabled(Log log) {
return log.isInfoEnabled();
}
public void log(Log log, String message, Object... args) {
log.info(message, args);
}
public void log(Log log, String message, Throwable throwable, Object... args) {
log.info(message, throwable, args);
}
}, WARN {
public boolean isEnabled(Log log) {
return log.isWarnEnabled();
}
public void log(Log log, String message, Object... args) {
log.warn(message, args);
}
public void log(Log log, String message, Throwable throwable, Object... args) {
log.warn(message, throwable, args);
}
}, ERROR {
public boolean isEnabled(Log log) {
return log.isErrorEnabled();
}
public void log(Log log, String message, Object... args) {
log.error(message, args);
}
public void log(Log log, String message, Throwable throwable, Object... args) {
log.error(message, throwable, args);
}
}, FATAL {
public boolean isEnabled(Log log) {
return log.isFatalEnabled();
}
public void log(Log log, String message, Object... args) {
log.fatal(message, args);
}
public void log(Log log, String message, Throwable throwable, Object... args) {
log.fatal(message, throwable, args);
}
};
// 定义三个抽象方法,用于多态的实现
/**
* 是否启用当前级别的日志
*/
abstract boolean isEnabled(Log log);
/**
* 记录当前级别的日志
* @param log
* @param message
* @param args
*/
abstract void log(Log log, String message, Object... args);
abstract void log(Log log, String message, Throwable throwable, Object... args);
}上面这个是 Level 枚举的代码,其中定义了三个包内可见的 abstract 方法,主要是为了把这三个方法仅提供给包内的类使用,其他地方不可使用。再回到 LogImpl 的那三个方法中,如今是采用这种步骤运作的,通过调用 Level 中具体的日志级别中具体的方法来实现 Level 指定日志级别的日志记录。通过对以上代码的重构,我们可以看出代码结构很清楚,调用明确,看不到 if...else 和 switch...case 语句,由于根据 Level 指定日志级别进行调用,完全掌控在 Level 这一个 enum 中,与其他类没有什么关系,与其他类之间的通信都是依赖于接口和抽象进行的。
面向对象语言中尽量少用
呵呵!
那么请问下switch 存在的意义呢!!
终于有一天,一个同学让我写个switch。。我说好吧然后我说额。。突然想起来switch是要int型哎
宝宝火了宝宝我理解你的
不过对于内部类,我很多疑惑
另,你是不是把源代码都快看完了