`

Java boolean类型 Getter Setter 的使用和细节.md

阅读更多

Java boolean类型 Getter Setter 的使用和细节.md

boolean 类型在Getter Setter问题上与其他类型有不小的差别,在用lombok重构GetterSetter时暴露了一些问题。

  • 系统中现有的Getter,Setter调用
  • 不能从json完整的反序列化,也不能正常序列化

问题分析案例演示整理如下:

定义一个Class,包含全部场景,基本类型的带is和不带is,包装类型带is和不带is。

private boolean busy;
private boolean isComplete;

private Boolean verify;
private Boolean isFinish;

IDE和lombok生成getter,setter的规则一样(本例使用lombok),都是sun定义的标准。

基本类型:无论带不带is,都是isXxx,setXxx。特殊,需要注意。 包装类型:和其他类型一样,getXxx,setXxx;getIsXxx,setIsXxx 和其他类型一致。

privatestatic GetterSetterTester getterSetter(){
    GetterSetterTester t = new GetterSetterTester();
    //基本类型:无论带不带is,都是isXxx,setXxx。   sun的标准,需要特殊注意
    t.isBusy();
    t.setBusy(true);
    t.isComplete();
    t.setComplete(true);

    //包装类型:和其他类型一样,getXxx,setXxx;(其他类型的isXxx也是 getIsXxx,setIsXxx,不算特例).
    t.getVerify();
    t.setVerify(true);
    t.getIsFinish();
    t.setIsFinish(true);
    return t;
}

和json相互转化(fastjson)

属性名是 isXxx 就期望json字段是isXxx。可是boolean类型的isXxx属性序列化出来是xxx。当然,isXxx的json是不能反序列化到class的boolean类型。因此,要序列化就用Boolean。 空对象时的json,基本类型默认是false,会输出;包装类型默认是null,不输出。

privatestaticvoidtestJson(GetterSetterTester t){
    //期望的json格式
    String json = "{\"busy\":true,\"isComplete\":true,\"isFinish\":true,\"verify\":true}";
    GetterSetterTester p = JSON.parseObject(json, GetterSetterTester.class);
    System.out.println(p.isBusy());
    System.out.println(p.isComplete());  //false
    System.out.println(p.getVerify());
    System.out.println(p.getIsFinish());
    //实际的json格式,可成功反序列化成对象。
    //基本类型变量无论是否有is,json都没有is(与getter一致)。
    System.out.println(t.toString());//{"busy":true,"complete":true,"isFinish":true,"verify":true}

    //空对象时的json,基本类型默认是false,会输出;包装类型默认是null,不输出。
    System.out.println(new GetterSetterTester().toString());//{"busy":false,"complete":false}
}

结论

  • boolean(基本类型)Getter,Setter 方法是个特例,需要注意。
  • Boolean(包装类型)Getter,Setter和其他类型一样。

当然,遇到的问题都是我们书写不规范导致,毕竟标准已经定义(这样费解的标准实在是...)。因此建议:方法内部使用可以用基本类型,如 for , >> 等;除此之外,都建议使用包装类型Boolean,如接口,持久化等。既然是面向对象,就少用基本类型。


完整测试类

package com.ndp.fb.rdb.model;

import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * Created by jacky.cheng on 2016/3/10.
 */
@Getter
@Setter
@NoArgsConstructor
public classGetterSetterTester{
    private boolean busy;
    private boolean isComplete;

    private Boolean verify;
    private Boolean isFinish;

    @Override
    public String toString(){
        return JSON.toJSONString(this);
    }

    publicstaticvoidmain(String[] args){
        GetterSetterTester t = getterSetter();
        testJson(t);
    }

    privatestatic GetterSetterTester getterSetter(){
        GetterSetterTester t = new GetterSetterTester();
        //基本类型:无论带不带is,都是isXxx,setXxx。   sun的标准,需要特殊注意
        t.isBusy();
        t.setBusy(true);
        t.isComplete();
        t.setComplete(true);

        //包装类型:和其他类型一样,getXxx,setXxx;(其他类型的isXxx也是 getIsXxx,setIsXxx,不算特例).
        t.getVerify();
        t.setVerify(true);
        t.getIsFinish();
        t.setIsFinish(true);
        return t;
    }

    privatestaticvoidtestJson(GetterSetterTester t){
        //期望的json格式
        String json = "{\"busy\":true,\"isComplete\":true,\"isFinish\":true,\"verify\":true}";
        GetterSetterTester p = JSON.parseObject(json, GetterSetterTester.class);
        System.out.println(p.isBusy());
        System.out.println(p.isComplete());  //false
        System.out.println(p.getVerify());
        System.out.println(p.getIsFinish());
        //实际的json格式,可成功反序列化成对象。
        //基本类型变量无论是否有is,json都没有is(与getter一致)。
        System.out.println(t.toString());//{"busy":true,"complete":true,"isFinish":true,"verify":true}

        //空对象时的json,基本类型默认是false,会输出;包装类型默认是null,不输出。
        System.out.println(new GetterSetterTester().toString());//{"busy":false,"complete":false}
    }

}

参考自:http://my.oschina.net/u/1010547/blog/634975
分享到:
评论

相关推荐

    随机模拟java数据插件Jmockdata.zip

    2. 被模拟的数据最好是plain bean,只提供getter,setter,has,is方法的才可以被模拟 3. 框架默认实现了40个元数据类型的数据模拟器包括: byte.class,Byte.class,byte[].class,Byte[].class, short.class,Short....

    EasySqlite:在android中使用sqlite的简单方法

    EasySqlite 在android中使用sqlite的简单方法 用法 [1]。 创建示例对象_你像往常一样创建对象并实现一些接口来使用这个库 :grinning_face_with_smiling_eyes: _ public class ... // getter & setter ....

    java实验6(Person.java)

    The Person class should have a setter method and a getter method with public access for each attribute. In the setter methods, get rid of any leading or trailing spaces (String trim() method). For...

    java基础试题.docx

    "Java基础试题总结" ...设计一个表示人的类 `Person`,分别是名字(`name`)、年龄(`age`),设计两个构造方法,一个带两个参数的构造方法,一个不带参的构造方法,提供 `name` 属性的 getter 和 setter 方法。

    编写一个Java项目,模拟一次包括老师备课,同学上课,布置作业和做作业的课堂教学过程。作业为判断字符串是否为2-重复串及其他字符串操作内容

    (2)public void stringOperate(),其中调用适当的字符串操作完成(a)判断两个字符传”abc”和”acb”是否相同,(b)输出"c:\\java\\jsp\\A.java"中第二次出现"\\j"的位置,并输出该位置起到串末的子串 3. 创建包...

    使用@IdClass创建联合主键,并实现外部关联

    在 Java Persistence API(JPA)中,联合主键是指由多个字段组成的主键,可以使用@IdClass注解来实现。在本文中,我们将介绍如何使用@IdClass创建联合主键,并实现外部关联。 首先,我们需要创建三个实体类:...

    Java开发之JSP行为

    Java Bean类非常简单,只有私有属性与对应的getter方法和setter方法。(注意:对于boolean类型的属性,习惯上一般把getter方法写成isXxx(),而不是getXxx())  2.代码实践  scope实现各种计数器  Counter....

    HomeWork.zip

    请通过反射技术,抽取Person所有的属性、方法,重新拼接成源文件字符串,再将字符串写入到一个新的文件”PersonX.java”中,java代码中的方法的方法体为空,即方法内部代码不用生成。请注意生成的java代码的格式。 2...

    javascript笔试题

    可以使用构造函数创建矩形对象,提供相应的 setter 和 getter 方法。 15. 编写一个 JavaScript 函数,实时显示当前时间格式为—年—月—日 时:分:秒。 可以使用 Date 对象和 setInterval 方法实现实时显示当前...

    跨数据库的ORM框架JugglingDB.zip

    你可扩展其他数据库的适配器,支持回调和钩子。 示例代码: var Schema = require('./jugglingdb').Schema; var schema = new Schema('redis', {port: 6379}); //port number depends on your configuration // ...

    Eddie:快速Java工具快速编码的环境

    ToolNameProperties :一个带有一组setter和getter的pojo对象。 Eddie将在配置文件中查找与所有设置匹配的属性。 所以如果有一种方法 void setFoo(boolean b) Eddie将在属性中搜索以下关键字: ToolName.foo = ...

    【05-面向对象(下)】

    仅为该类的属性提供getter方法,不要为该类的属性提供setter方法,因为普通方法无法修改final修饰的 属性  –4.如有必要,重写Object类中hashCode 和equals •缓存实例的不可变类:如果程序经常需要使用不可变类...

    PHP-AutoMapper:PHP对Jimmy Bogard著名的.NET的AutoMapper的改编,将一个对象的属性自动映射到另一个对象

    受保护的或私有的属性以及方法,getter和setter将被忽略。 目标类的属性需要具有适当的元素,格式为: /** @var type */ 任何标量类型(int,integer,bool,boolean,float,double,real,string)都将被复制而...

    Programming in Objective-C 4th Edition

    The copy and mutableCopy Methods 413 Shallow Versus Deep Copying 416 Implementing the <NSCopying> Protocol 418 Copying Objects in Setter and Getter Methods Exercises 423 19 Archiving 425 Archiving ...

Global site tag (gtag.js) - Google Analytics