Java高质量代码之 — 数据类型_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java高质量代码之 — 数据类型

Java高质量代码之 — 数据类型

 2013/8/19 21:30:28  ray_yui  程序员俱乐部  我要评论(0)
  • 摘要:前言:由于上一个星期工作繁忙,利用上下班和晚上睡前空余的时间拜读了秦小波老师的《改善Java程序的151建议》,感觉廓然开朗,注意到了很多平时在编写代码中并不会注意的问题,甚至感觉自己对Java只是略懂皮毛,不足以登大雅之堂,特此与读者分享读书笔记,以下内容摘自《改善Java程序的151建议》一书和笔者的理解Java高质量代码系列文章面向对象篇:http://ray-yui.iteye.com/blog/1926984数据类型篇:http://ray-yui.iteye
  • 标签:数据类型 Java 代码 数据

前言:由于上一个星期工作繁忙,利用上下班和晚上睡前空余的时间拜读了秦小波老师的《改善Java程序的151建议》,感觉廓然开朗,注意到了很多平时在编写代码中并不会注意的问题,甚至感觉自己对Java只是略懂皮毛,不足以登大雅之堂,特此与读者分享读书笔记,以下内容摘自《改善Java程序的151建议》一书和笔者的理解


Java高质量代码系列文章
      面向对象篇:http://ray-yui.iteye.com/blog/1926984
      数据类型篇:http://ray-yui.iteye.com/blog/1927251


在Java当中有8种基本数据类型,分别是byte,char,short,int,long,float,double,boolean还有其对应的封装类型Byte,Character,Short,Integer,Long,Float,Double,Boolean,那我们究竟对他们有多少的了解呢?


1.用偶判断,不用奇判断
      在Java中可以使用取余的方式来进行奇数还是偶数的判断,请看以下代码

class="java" name="code">
public static void main(String[] args) {
		int num = -1;
		System.out.println(num % 2 == 1 ? "奇数" : "偶数");
		// 输出结果为偶数
	}


      从上面代码中,-1怎么可能是偶数呢?首先我们就需要了解Java是如何取余的

public static int remainder(int dividend, int divisor) {
		return dividend - dividend / divisor * divisor;
	}


      现在一切就明了了,-1的运算结果还是-1,以后记得写成num % 2 == 0


2.对精确货币计算使用BigDecimal类型
      在使用货币计算时,我们首先想到的是使用double类型,但在计算机世界中,浮点类型有可能是不准确的,他只能无限的接近某一个值,而不会完全精准,这是因为二进制的原因,就像用10进制无办法表示10 / 3一样,所以对于精确的货币计算,应该使用BigDecimal类型,而却BigDecimal和数据库中的NUMBER和DECIMAL类型很好的匹配


3.注意类型的默认转换
     在Java当中,当大的类型与小类型进行运算时,该运算会自动提升为大类型,这种转换成为加宽类型,例如long类型和int类型进行运算后会自动提升为long类型,请观察一下代码

public static void main(String[] args) {
		// 2147483647为int最大值
		long num = 2147483647 + 1;
		System.out.println(num);
		// 运行结果为 -2147483648
	}


     以上代码中,2147483647为int类型的最大值,我使用long类型来接受int最大值+1应该是没问题的,但事实并不是如此,这是因为在Java中是先运算再进行类型转换的,二者都是int类型,所以运算结果也应该是int类型,所以超出了int类型的最大范围,此时修改为2147483647L + 1 就能成功运算


4.数值类型最大值应使用Java提供常量
      在3的例子当中,我们使用了int的最大值2147483647,当然读者可能是有超人的记忆把int的最大值和最小值记住了,但short类型呢?long类型呢?所以我们应该使用Java自带的常量来获取数值类型的最大值和最小值,请看以下代码

public static void main(String[] args) {
		// int类型最大值
		int maxInt = Integer.MAX_VALUE;
		// int类型最小值
		int minInt = Integer.MIN_VALUE;
		// long类型最大值
		long maxLong = Long.MAX_VALUE;
		// long类型最小值
		long minLong = Long.MIN_VALUE;
		// short类型最大值
		short maxShort = Short.MAX_VALUE;
		// short类型最小值
		short minShort = Short.MIN_VALUE;

	}


5.注意数值的边界判断
      请来观看下面的代码

public static void main(String[] args) {
		test(Integer.MAX_VALUE + 1);
	}

	public static void test(int num) {
		if (num < 2000) {
			System.out.println("执行");
		}
	}


      test方法的逻辑非常简单,若然int类型的数值少于2000就执行,当我使用int类型的最大值+1时,就因为类型越界而变成int的最少值,所以满足少于2000的条件从而执行方法,所以对于严谨的程序,应该进行 业务/正最大/负最小 的边界判断,特别是从前台接受过来的值


6.提防包装类的null值
      包装类型是基本类型的包装类,当使用包装类型时,其实就生成了对象,当然对象是允许为null的,所以需要注意包装类型的!null判断


7.理解基本类型-->包装类型装箱拆箱过程
      以下为Intger类型例子,Double和Float等同理
      从基本类型-->包装类型是调用包装类型的valueOf()方法来进行转换
      从包装类型-->基本类型是调用包装类型的intValue()方法来进行转换


8.优先选择基本类型
      我们都知道,基本类型是存在栈的,而包装类型因为是类,对象,所以是存在堆中,在处理速度上,由于基本类型是原生类型,所以速度更快,其实换个思维也可以思考到,包装类型封装了属性和方法,生成的速度会比基本类型慢,而且当包装类型进行运算时,都将调用intValue()方法然后再调用valueOf()方法封装回包装类型,所以在可行的情况下,优先选择基本类型,但在特定的框架例如Hibernate中,推荐使用包装类型


总结:
      笔者在本文章中只从《改善Java程序的151建议》中提取部分进行归纳性叙述,推荐各位读者购买这本书,该书不仅从事例中学习,而且涉及到原理,底层的实现,不仅告诉你应该怎么做,还告诉你为什么要这样做.
发表评论
用户名: 匿名