深入了解JavaBean规范中的属性名和setter/getter方法

JavaBean规范文档:http://download.oracle.com/otndocs/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/

关于属性名的部分:

Utility method to take a string and convert it to normal Java variable name capitalization. This normally means converting the first character from upper case to lower case, but in the (unusual) special case when there is more than one character and both the first and second characters are upper case, we leave it alone.
Thus “FooBah” becomes “fooBah” and “X” becomes “x”, but “URL” stays as “URL”.

工具翻译+个人修改:

工具方法把一个字符串并将其转换为正常的Java变量名的大写。这通常意味着将第一个字符从大写转换为小写,
但在(特殊)的特殊情况下,当前两个字符或多个字符是大写时,我们不处理他(直接返回)。

因此,“Foobah”变成了“foobah”和“X”变成了“x”,但“URL”仍然是“URL”。

以上的内容实际上是java.bean.Introspector#decapitalize这个方法的javadoc注释。

方法如下:

/**
 * Utility method to take a string and convert it to normal Java variable
 * name capitalization.  This normally means converting the first
 * character from upper case to lower case, but in the (unusual) special
 * case when there is more than one character and both the first and
 * second characters are upper case, we leave it alone.
 * <p>
 * Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays
 * as "URL".
 *
 * @param  name The string to be decapitalized.
 * @return  The decapitalized version of the string.
 */
public static String decapitalize(String name) {
    if (name == null || name.length() == 0) {
        return name;
    }
    if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
                    Character.isUpperCase(name.charAt(0))){
        return name;
    }
    char chars[] = name.toCharArray();
    chars[0] = Character.toLowerCase(chars[0]);
    return new String(chars);
}

我们使用这个方法对几种不同的字段名进行测试:

看下面的代码:

public class TestBean {
    public static void main(String[] args) {
        System.out.println(Introspector.decapitalize("name"));
        System.out.println(Introspector.decapitalize("Name"));
        System.out.println(Introspector.decapitalize("mName"));
        System.out.println(Introspector.decapitalize("NAME"));
    }
}

输出:

name
name
mName
NAME

从结果来看nameName的结果是一样的,也就是说如果字段名是Name,会被当成name使用,因此从这个角度来说这种命名方式是错误的,不符合规范的。

mName是没问题问题的。NAME也没有问题,NAme,NAMe这样也不会有错。

这篇文章说深入可能还不够资格,并且标题中的setter和getter根本没提。如果有不明白的地方,欢迎留言!

时间: 2024-08-08 13:54:09

深入了解JavaBean规范中的属性名和setter/getter方法的相关文章

使用mybatis如果类属性名和数据库中的属性名不一样取值就会为null

使用mybatis时如果类属性名和数据库中的属性名不一样取值就会为null 这是不能再去改变javabean中的属性,只能改变sql语句.语句如下所示: <select id="selectEmp" resultType="com.atguigu.mybatis.bean.Employee"> select id,last_name lastName,gender,email from tbl_employee where id= #{id} </

Linux 中改变主机名的 4 种方法

今天,我们将向你展示使用不同的方法来修改主机名.你可以从中选取最适合你的方法. -- Magesh Maruthamuthu 昨天我们已经在我们的网站中写过 如何在 Linux 中修改主机名的文章 .今天,我们将向你展示使用不同的方法来修改主机名.你可以从中选取最适合你的方法. 使用 systemd 的系统自带一个名为 hostnamectl 的好用工具,它可以使我们能够轻易地管理系统的主机名. 当你使用这个原生命令时,它可以立刻改变主机名而无需重启来生效. 但假如你通过手动修改某个配置文件来更

Java反射获取对象VO的属性值(通过Getter方法)

有时候,需要动态获取对象的属性值. 比如,给你一个List,要你遍历这个List的对象的属性,而这个List里的对象并不固定.比如,这次User,下次可能是Company. e.g. 这次我需要做一个Excel导出的工具类,导出的批量数据是以List类型传入的,List里的对象自然每次都不同,这取决于需要导出什么信息. 为了使用方便,将对象的属性名与属性值存于Map当中,使用时就可以直接遍历Map了. 此次的思路是通过反射和Getter方法取得值,然后记录在一个Map当中. Kick start

黑马程序员_Objective C中的@property 与 @synthesize 快速生成setter getter方法

<a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>.<a href="http://www.itheima.com"target="blank">.Net培训</a>.期待与您交流! 一般来说在一个类中 成员变量是会有setter 跟getter方法的. 如果每一个成员变量的setter 跟gett

Effective JavaScript Item 39 绝不要重用父类型中的属性名

本系列作为Effective JavaScript的读书笔记. 如果需要向Item 38中的Actor对象添加一个ID信息: function Actor(scene, x, y) { this.scene = scene; this.x = x; this.y = y; this.id = ++Actor.nextID; scene.register(this); } Actor.nextID = 0; 同时,也需要向Actor的子类型Alien中添加ID信息: function Alien(

【整理】Object-C中的属性(Property)的Setter:assign,copy,retain,weak,strong之间的区别和联系

iOS编程过程中,经常看到一些属性前面有些修饰符,比如copy,retain等. 这些关键字,是Object-C语言中,对于Property的setter. Mac官网: The Objective-C Programming Language – Declared Properties – Setter Semantics 中的解释是: Setter Semantics These attributes specify the semantics of a set accessor. They

ASP.NET MVC验证框架中关于属性标记的通用扩展方法

http://www.cnblogs.com/wlb/archive/2009/12/01/1614209.html 之前写过一篇文章<ASP.NET MVC中的验证>,唯一的遗憾就是在使用Data Annotation Validators方式验证的时候,如果数据库是Entityframework等自动生成的文件,就没有办法使用扩展属性标记进行标记.现在已经开始有了一些其它的Asp.net MVC 验证框架,使用上跟Data Annotation Validators差不太多,但是普遍有这样

对对象中的属性赋值(两种方法)

第一种方法:使用引用名称.属性名称 = 值; 如:Tom.breed = "泰迪"; 第二种方法:使用构造方法完成 原文地址:https://www.cnblogs.com/penphy/p/10914170.html

Intellij IDEA中lombok包setter / getter方法失效

一. 问题描述:Gitlab上clone工程到IDEA后,代码中Entity类的getter / setter方法编译报错,检查了pom.xml文件,有lombok依赖,Entity类上也有@Data注解并能编译成功,如下: 二. 解决方法: 1.联网情况下,在线安装lombok插件: 2.由于公司的项目是基于华为云桌面开发,并且不能联网,无法在线安装lombok插件,需要在云桌面外下载lombok插件,复制到云桌面的disk,IDEA从disk上导入安装: 这里要选择zip文件,根据提示重启I