《编写高质量代码—改善java程序的151个建议》知识整理一
1、用偶判断,不用奇判断
案例:在代码i%2==1?"奇数":"偶数" (java中的求余算法相当于:divided-divided/divisor*divisor)中,当被除数i为-1时,结果是偶数,判断失误,所以该程序应改为:i%2==0?"偶数":"奇数"
2、不要让类型默默转化
案例:代码long d=lg*60*8,当整型的lg参数和另外两个参数相乘超出整型边界的时候就会变成负数,在转换为long型,结果还是负值
所以代码需要改为:long d=lg*60*8*1l;
3、在接口中不要存在实现代码
public class Client {
public static void main(String[] args) {
//调用接口的实现
B.s.doSomething();
}
} interface B {
public static final S s=new S(){
public void doSomething(){
System.out.println("我在接口中实现了");
}
};
} interface S {
public void doSomething();
}虽然成功打印出了结果。但是如果把实现代码写到接口中,那接口就绑定了可能变化的因素,这就会导致实现不再稳定和可靠,是随时都可能被抛弃、呗更改、被重构的。所以接口中虽然可以有实现,但应该避免使用。
4、静态变量一定要先声明后赋值
代码:
public class demo2 { static{
i=100;
}
public static int i=1;
public static void main(String[] args) {
System.out.println(i);
} }public class demo2 {
public static int i=1;
static{
i=100;
}
//public static int i=1;
public static void main(String[] args) {
System.out.println(i);
} }两段代码的输出结果分别为:1和100,两段代码都能编译,都有结果,值却不一样,这是什么原因呢?我们知道静态变量是类加载时被分配到数据区(Date Area)的,它在内存中只有一个拷贝,它以后的所有操作都是只改变值而不改变地址,而jvm是先声明再赋值,例如:int i=100;等价于int i;//分配地址 i=100//赋值,所以在类初始化的时候,jvm会查找类中的所有静态声明进行加载,然后分配空间。所以向上面这种情况,只是完成了地址空间的分配,而没有赋值,之后jvm就会按照先后顺序来进行复制,所以第二段代码到最后输出的结果为1也就不足为奇了。
5、不要覆写(Override)静态方法,可以隐藏
代码:
public class Baseextend {
public static void doSomething(){
System.out.println("我是父类静态方法");
}
public void doAnything(){
System.out.println("我是父类非静态方法");
}
} public class Subextend extends Baseextend{ public static void doSomething(){
System.out.println("我是子类静态方法");
}
public void doAnything(){
System.out.println("我是子类非静态方法");
}
} public class Extendtext {
@SuppressWarnings("static-access")
public static void main(String[] args) {
Baseextend base=new Subextend();
base.doSomething();
base.doAnything(); }
}上面的输出结果为:我是父类静态方法 我是子类非静态方法
分析原因:我们知道一个实例对象有两个类型:表面类型(Apparent Type)和实际类型(Actual Type),表面类型是声明时的类型,实际类型是对象产生时的类型。比如例子base的表面类型是Baseextend,实际类型是Subextend。对于非静态方法,它是根据对象的实际类型来执行的,对于静态方法,如果采用类实例(对象)的方法来访问,jvm则会通过对象的表面类型来访问对应的静态方法,所以出现上面的结果也就不足为奇了。
《编写高质量代码—改善java程序的151个建议》知识整理一的更多相关文章
- 博友的 编写高质量代码 改善java程序的151个建议
编写高质量代码 改善java程序的151个建议 http://www.cnblogs.com/selene/category/876189.html
- 编写高质量代码改善java程序的151个建议——导航开篇
2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...
- 编写高质量代码改善java程序的151个建议——[1-3]基础?亦是基础
原创地址: http://www.cnblogs.com/Alandre/ (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks The reasonable man adapts himse ...
- 编写高质量代码:改善Java程序的151个建议 --[117~128]
编写高质量代码:改善Java程序的151个建议 --[117~128] Thread 不推荐覆写start方法 先看下Thread源码: public synchronized void start( ...
- 编写高质量代码:改善Java程序的151个建议 --[106~117]
编写高质量代码:改善Java程序的151个建议 --[106~117] 动态代理可以使代理模式更加灵活 interface Subject { // 定义一个方法 public void reques ...
- 编写高质量代码:改善Java程序的151个建议 --[78~92]
编写高质量代码:改善Java程序的151个建议 --[78~92] HashMap中的hashCode应避免冲突 多线程使用Vector或HashTable Vector是ArrayList的多线程版 ...
- 编写高质量代码:改善Java程序的151个建议 --[65~78]
编写高质量代码:改善Java程序的151个建议 --[65~78] 原始类型数组不能作为asList的输入参数,否则会引起程序逻辑混乱. public class Client65 { public ...
- 编写高质量代码:改善Java程序的151个建议 --[52~64]
编写高质量代码:改善Java程序的151个建议 --[52~64] 推荐使用String直接量赋值 Java为了避免在一个系统中大量产生String对象(为什么会大量产生,因为String字符串是程序 ...
- 编写高质量代码:改善Java程序的151个建议 --[36~51]
编写高质量代码:改善Java程序的151个建议 --[36~51] 工具类不可实例化 工具类的方法和属性都是静态的,不需要生成实例即可访 问,而且JDK也做了很好的处理,由于不希望被初始化,于是就设置 ...
- Github即将破百万的PDF:编写高质量代码改善JAVA程序的151个建议
在通往"Java技术殿堂"的路上,本书将为你指点迷津!内容全部由Java编码的最佳 实践组成,从语法.程序设计和架构.工具和框架.编码风格和编程思想等五大方面,对 Java程序员遇 ...
随机推荐
- MYSQL select时锁定记录问题
在使用SQL时,大都会遇到这样的问题,你Update一条记录时,需要通过Select来检索出其值或条件,然后在通过这个值来执行修改操作. 但当以上操作放到多线程中并发处理时会出现问题:某线程selec ...
- Android学习系列(7)--App轮询服务器消息
这篇文章是android开发人员的必备知识. 1.轮询服务器 一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务. 其中需要注意轮询的频率 ...
- [转]ASP.NET MVC Jquery Validate 表单验证的多种方式介绍
在我们日常开发过程中,前端的表单验证很重要,如果这块处理不当,会出现很多bug .但是如果处理的好,不仅bug会很少,用户体验也会得到很大的提升.在开发过程中我们可以不借助 JS 库,自己去手写 JS ...
- kettle作业(job)调用转换,设置变量,写日志到数据库中【转】
首先建立转换:从数据库表到日志 表输入的设置: 日志设置: 新建job: 转换选择刚才建好的输出日志转换.变量设置如下: 此ID就是转换中的${ID},执行job,可以看到控制台输出日 ...
- 树莓PI上跑爬虫
主要是进行主机上使用myeclipse开发后,在从机上跑最后的程序 在主机上和树莓上都安装好java环境,maven,ant 拷到RPI上的时候修改
- class0513(html基础加强)
内容:HTML.CSS 目标:掌握手写HTML实现一般难度的Web页面的能力(如网站注册表单),为ASP.Net学习打基础.坚持手写HTML,可视化设计只是一种自学的手段. 参考书:张孝祥<Ja ...
- DIY 博客全文界面的推荐、反对、加关注、返回顶部、快速评论等小功能的集成
博客园已经很不错了,但作为比较“挑剔”的用户,在使用的过程中,还是有一些地方不爽的. 我不是一个专业的前台程序员,也只能凭借自己蹩脚的JS和CSS知识完成对页面的小改造(专业的大虾莫要鄙视呀..). ...
- Google的IP地址一览表,加上代理服务器
Bulgaria 93.123.23.1 93.123.23.2 93.123.23.3 93.123.23.4 93.123.23.5 93.123.23.6 93.123.23.7 93.123. ...
- 【C语言】-循环结构-while语句
while语句: while循环可实现"当型"循环,即当条件成立时,执行循环体.适合无法确定循环执行次数的情况. while (表达式) { 循环语句 } 注意: 表达式为循环控制 ...
- if/else语句匹配问题
1: if(*FixedMode == LNG_OUT_FIXED_AMOUNT){ 2: if(NumTemp > MIN_FIXED_AMOUNT && NumTemp &l ...