[改善Java代码]别让null值和空值威胁到变长方法
2016-04-20 14:12
183 查看
建议5:别让null值和空值威胁到变长方法
两个methodA都进行了重载,现在的问题是:上面的代码编译通不过,问题出在什么地方?看似很简单哦。
有两处编译通不过:client.methodA("China")和client.methodA("China",null),估计你已经猜到了,两处的提示是相同的:方法模糊不清,编译器不知道调用哪一个方法,但这两处代码反映的代码味道可是不同的。(The method methodA(String, Integer[]) is ambiguous for the type Client)
KISS原则(Keep It Simple, Stupid,即懒人原则),按照此规则设计的方法应该很容易调用,可是现在在遵循规范的情况下,程序竟然出错了,这对设计者和开发者而言都是应该严禁出 现的。
对于client.methodA("china",null)方法,直接量null是没有类型的,虽然两个methodA方法都符合调用请求,但 不知道调用哪一个,于是报错了。我们来体会一下它的坏味道:除了不符合上面的懒人原则外,这里还有一个非常不好的编码习惯,即调用者隐藏了实参类型,这是 非常危险的,不仅仅调用者需要“猜测”该调用哪个方法,而且被调用者也可能产生内部逻辑混乱的情况。对于本例来说应该做如下修改:
也就是说让编译器知道这个null值是String类型的,编译即可顺利通过,也就减少了错误的发生。
public class Client { public void methodA(String str,Integer... is){ } public void methodA(String str,String... strs){ } public static void main(String[] args) { Client client = new Client(); client.methodA("China", 0); client.methodA("China", "People"); client.methodA("China"); client.methodA("China",null); } }
两个methodA都进行了重载,现在的问题是:上面的代码编译通不过,问题出在什么地方?看似很简单哦。
有两处编译通不过:client.methodA("China")和client.methodA("China",null),估计你已经猜到了,两处的提示是相同的:方法模糊不清,编译器不知道调用哪一个方法,但这两处代码反映的代码味道可是不同的。(The method methodA(String, Integer[]) is ambiguous for the type Client)
KISS原则(Keep It Simple, Stupid,即懒人原则),按照此规则设计的方法应该很容易调用,可是现在在遵循规范的情况下,程序竟然出错了,这对设计者和开发者而言都是应该严禁出 现的。
对于client.methodA("china",null)方法,直接量null是没有类型的,虽然两个methodA方法都符合调用请求,但 不知道调用哪一个,于是报错了。我们来体会一下它的坏味道:除了不符合上面的懒人原则外,这里还有一个非常不好的编码习惯,即调用者隐藏了实参类型,这是 非常危险的,不仅仅调用者需要“猜测”该调用哪个方法,而且被调用者也可能产生内部逻辑混乱的情况。对于本例来说应该做如下修改:
public static void main(String[] args) { Client client = new Client(); String[] strs = null; client.methodA("China",strs); }
也就是说让编译器知道这个null值是String类型的,编译即可顺利通过,也就减少了错误的发生。
相关文章推荐
- 【项目管理和构建】十分钟教程,eclipse配置maven + 创建maven项目(三)
- java学习笔记3
- ios 和 java byte[]的兼容处理
- 【LeetCode-137】Single Number II
- eclipse启动时devices.xml报错 不具有面有效性。它必须是来自枚举的值。
- Java BIO、NIO、AIO、同步、异步
- 关于maven的依赖分析
- java中InputStream转化为byte[]数组
- java学习笔记2
- java从本地向另外一个地址发送请求
- Java抽象类和接口的区别
- 《疯狂Java讲义(第3版)》.(李刚)——前言
- java中的进制
- java web classpath
- MD5加密--Java
- SpringMVC 基于注解的Controller详解
- Java线程与内存模型
- eclipse 的开发人员的 android studio 手册
- mysql和Myeclipse的小问题
- [改善Java代码]避免带有变长参数的方法重载