java开发150个建议

阅读目录
建议1:不要在常量和变量中出现易混淆的字母
包名全小写,类名首字母全大写,常量全部大写并用下划线分隔,变量采用驼峰命名法(Camel Case)命名等,这些都是最基本的Java编码规范,是每个都应熟知的规则,但是在变量的声明中要注意不要引入容易混淆的字母 。尝试阅读如下代码,思考打印结果的i是多少:
1 public class Demo{2public static void main(String[] args) {3test01();4}56public static void test01(){7long i=1l;8System.out.println("i的两倍是:"+(i+i));9}10 }
肯定会有人说:这么简单的例子还能出错?运行结果肯定是22!实践是检验真理的唯一标准,将其Run一下看看,或许你会很奇怪,结果是2,而不是22.难道是编译器出问题了,少了个"2"?
因为赋给变量i的值就是数字"1",只是后面加了长整型变量的标示字母"l"而已 。别说是我挖坑让你跳,如果有类似程序出现在项目中,当你试图通过阅读代码来理解作者的思想时,此情景就可能会出现 。所以为了让你的程序更容易理解,字母"l"(包括大写字母"O")尽量不要和数字混用,以免使读者的理解和程序意图产生偏差 。如果字母和数字混合使用,字母"l"务必大写,字母"O"则增加注释 。
注意:字母"l"作为长整型标志时务必大写 。
建议2:莫让常量蜕变成变量
常量蜕变成变量?你胡扯吧,加了final和的常量怎么可能会变呢?不可能为此赋值的呀 。真的不可能吗?看看如下代码:
1 import java.util.Random;2 3 public class Demo01 {4public static void main(String[] args) {5test02();6}7 8public static void test02() {9System.out.println("常量会变哦:" + Constant.RAND_CONST);10}11 }12 13 interface Constant {14public static final int RAND_CONST = new Random().nextInt();15 }
是常量吗?它的值会变吗?绝对会变!这种常量的定义方式是绝对不可取的,常量就是常量,在编译期就必须确定其值,不应该在运行期更改,否则程序的可读性会非常差,甚至连作者自己都不能确定在运行期发生了何种神奇的事情 。
甭想着使用常量会变的这个功能来实现序列号算法、随机种子生成,除非这真的是项目中的唯一方案,否则就放弃吧,常量还是当常量使用 。
注意:务必让常量的值在运行期保持不变 。
建议3:三元操作符的类型务必一致
三元操作符是if-else的简化写法,在项目中使用它的地方很多,也非常好用,但是好用又简单的东西并不表示就可以随意使用,看看如下代码:
1 public static void test03() {2int i = 80;3String str = String.valueOf(i < 100 ? 90 : 100);4String str1 = String.valueOf(i < 100 ? 90 : 100.0);5System.out.println("两者是否相等:" + str.equals(str1));6}
分析一下这段程序,i是80,小于100,两者的返回值肯定都是90,再转成类型,其值也绝对相等,毋庸置疑的 。嗯,分析的有点道理,但是变量str中的三元操作符的第二个操作数是100,而str1中的第二个操作数是100.0,难道木有影响吗?不可能有影响吧,三元操作符的条件都为真了,只返回第一个值嘛,于第二个值有毛线关系,貌似有道理 。
运行之后,结果却是:"两者是否相等:false",不相等,why?
问题就出在了100和100.0这两个数字上,在变量str中,三元操作符的第一个操作数90和第二个操作数100都是int类型,类型相同,返回的结果也是int类型的90,而变量str1中的第一个操作数(90)是int类型,第二个操作数100.0是浮点数,也就是两个操作数的类型不一致,可三元操作符必须要返回一个数据,而且类型要确定,不可能条件为真时返回int类型,条件为假时返回float类型,编译器是不允许如此的,所以它会进行类型转换int类型转换为浮点数90.0,也就是三元操作符的返回值是浮点数90.0,那么当然和整型的90不相等了 。这里为什么是整型转成浮点型,而不是浮点型转成整型呢?这就涉及三元操作符类型的转换规则: