2015年08月09日 16:44:42 DO IT 阅读数:1079 标签: java属性名
关于属性名
“属性名前两个字母要么都是大写的 要么都是小写的”。。。。。。
为什么这么说呢?仅仅是因为规范么?人生若只如初见该多好,那就挺听一个对java的初见小菜鸟根据感受娓娓道来吧。。。。
刚开始接触java时认为声明的全局变量就是对象的属性,当然这也是最初的定义,老师刚开始也这么讲。于是通过对属性的赋值操作来改变对象的状态。
当然没过多久,就明白了面向对象的一个特性--》封装性。这时才明白,不能像之前那么随心所遇的改变对象的状态了,要通过getter、setter 进行对应的访问,当然这也是必须的,因为没有对象愿意把自己的隐私全部暴露出来,没有哪个Person类的对象愿意把性别设置成 男、女之外其他的什么。。。
再后来,便一步步陷入java的深渊,开始解除令人惊叹不已的反射机制了,这也算是java作为强大的动态语言的根本所在吧。我们可以在运行时对内存中的对象一览无余,当然也是因为内存中有他对应的类的Class实例,也就对他的类结构了如指掌了。
甚至可以获取、操作私有的结构,包括私有化的属性,记得有一个好问的同学说了一句: ‘我们就这么就获取到了千辛万苦私有化的属性,这不违背了封装性了’。不错如果真 的直接这样对属性进行赋值了,的确是违背了封装性,数据又不安全了。
但是反射机制是无法避免的,虽然对象不小心暴露他的这些隐私了,但是我们可以装作不知道么,最起码尊重一下他人,当然这也是最安全的做法,没准稍微好奇一下他就或死或残了呢。所以我们可以继续装作获取不到这些属性,可以按照封装性的思想继续通过getter setter访问不是极好么?
所以到现在学到一些框架、工具等对象,发现大量的反射,对属性的操作当然也是通过getter setter访问比较安全。 所以到这个阶段所说的属性基本上就指的是通过getter setter方法来定义的属性 比如 setAge() 属性就是age setNumber() 属性就是number。
最初大家都知道,getter setter 前三个字母之后,第一个字母小写,这便是属性名了, 但是如果想定义了两个字段名是iDCard 跟IDcard。他们的setter岂不是一样了, 产 生了混淆。同样idCard跟IdCard 根据setter方法也产生了混淆。因为长得一 样, 但是java只能做一个决定。所以通过这种setter方法定义的属性名只能返回一种, 具 体怎么返回,源码规则是这样的:
if (str == null || str.length() == 0) {
return str;
}
if (str.length() > 1 && Character.isUpperCase(str.charAt(1))
&& Character.isUpperCase(str.charAt(0))) {
return str;
} else {
char ca[] = str.toCharArray();
ca[0] = Character.toLowerCase(ca[0]);
return new String(ca);
}
就是说,如果set后前两个字母都大写,那么属性值原样返回,否则将首字母小写返回。这样的结果就是要么前两个字母都大写,要么都小写。所以有了那句话,“属性名前两个字母要么都是大写 要么都是小写”,所以为了避免字段与属性的混淆,我们在字段的命名上也尽量按照这一规则。在使用反射时,也要根据setter/getter赋值与取值。