`

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
分享到:
评论

相关推荐

    IDEA设置生成带注释的getter和setter的图文教程

    通常,我们使用IDEA时,默认生成的getter和setter方法是不带注释的,但是,我们可以通过设置IDEA来生成带有Javadoc的模板,以下是具体的设置方法。 首先,我们需要新建一个Template,点击"+"号,然后输入名称,点击...

    java比较器.md

    // Getter and Setter methods... public static Comparator<Person> byName = new Comparator() { @Override public int compare(Person p1, Person p2) { return p1.getName().compareTo(p2.getName()); } ...

    struts2 依赖注入boolean类型的属性时报错

    2. 确保Action类中的getter和setter方法与属性类型匹配。 3. 查看Struts2的日志输出,其中可能包含了错误的详细信息。 4. 使用IDE的代码分析工具检查可能出现的类型匹配问题。 5. 如果使用的是第三方工具,确认其与...

    Hibernate中数据类型

    - **布尔类型**:`boolean` 和 `java.lang.Boolean` 可以映射为 `BIT`,但为了更易读,还可以映射为 `yes_no` 或 `true_false` 的 `CHAR(1)` 类型,其中存储 'Y' 或 'N' 来表示真或假。 - **日期时间类型**:`java....

    Java零基础-访问控制权限修饰符.md

    2. **原则二:封装** —— 通过将成员变量声明为`private`并提供公共的getter和setter方法,可以有效地实现数据封装,确保数据的完整性和一致性。 3. **原则三:考虑继承关系** —— 当设计类时考虑到可能存在的...

    Android实现类似微信联系人中的分组列表的例子

    // 构造函数,getter和setter方法... } public class Child { private String childName; // 构造函数,getter和setter方法... } ``` 2. 数据适配器: 创建一个自定义的ExpandableListAdapter,继承自...

    Java 开发 json 数据的jar 涉及的相关包 Java_json_lib_2.4.zip

    - 对于自定义的Java类,你需要提供合适的getter和setter方法,以便JSON_lib能够正确地序列化和反序列化对象。 3. **处理数组和集合**: - JSON_lib提供了`JSONArray`类来处理JSON数组。你可以通过`JSONArray.from...

    k-means的java实现

    ### K-means算法的Java实现 #### 一、K-means算法简介 ...以上是K-means算法的Java实现细节,通过这些类的定义和相互协作,可以有效地实现K-means算法的基本功能。这种实现方式简洁明了,便于理解和扩展。

    阿里规范:为何boolean类型变量命名禁用is开头

    首先,让我们理解Java中的getter和setter方法。这些方法是用于访问和修改对象的私有属性,遵循特定的命名规则。对于非boolean类型的属性,getter方法通常以"get"开头,setter方法以"set"开头。例如: ```java ...

    标签使用

    在JavaServer Faces (JSF)开发中,`rich:listShuttle`是RichFaces库中的一个非常实用的组件,主要用于实现列表项的双向选择和移动功能。例如,在用户界面中展示两个列表,并允许用户通过按钮将项目从一个列表移动到...

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

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

    java下的购物车系统

    在`akcJAVAshopCart`压缩包中,可能包含了实现上述功能的源代码文件,例如`Book.java`、`ShoppingCart.java`以及可能的测试类和配置文件。为了运行和测试这个系统,你需要解压文件,导入到IDE(如IntelliJ IDEA或...

    java json文档和示例

    // 构造函数、getter和setter... } ``` 四、Gson使用示例 ```java import com.google.gson.Gson; public class GsonExample { public static void main(String[] args) { // 创建一个对象 Person person = new...

    JAXB注解相关技术

    - 使用场景:当需要改变默认的访问策略时,例如,如果类中没有 getter 和 setter 方法但希望使用字段进行映射。 4. **`@XmlAttribute`** - 作用:定义 Java 属性如何映射到 XML 属性。 - 使用场景:当希望将 ...

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

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

    java实验报告类与对象

    实验原理:我们使用 Java 语言来编写程序,学习了如何定义类、如何使用构造函数、getter 和 setter 方法、如何使用 toString() 方法等。 实验报告 实验报告 1: 写出顾客类 Customer 的代码。 实验报告 2: 画...

    Java包装类详解.pptx.pptx

    - 例如,包装类提供了getter和setter方法来访问和修改内部封装的基本数据类型,遵循封装原则。 5. **包装类的封装特性** - 封装是面向对象的三大特性之一,包装类实现了对基本数据类型的封装,隐藏了内部细节,...

    ExpandableList

    **ExpandableListView详解** 在Android开发中,`ExpandableListView`是一个非常实用的视图组件,主要用于展示具有层级结构的数据。...熟练掌握其使用和优化技巧,可以提升用户体验,打造更优秀的应用界面。

    java递归无限层级树

    // 构造函数、getter和setter方法... } ``` 接着,我们创建一个递归方法来生成无限层级的树。这个方法接受当前的层级和父节点,然后根据业务逻辑决定是否创建新的子节点。例如,如果一个节点在某个条件下应有子...

Global site tag (gtag.js) - Google Analytics