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来生成带有Javadoc的模板,以下是具体的设置方法。 首先,我们需要新建一个Template,点击"+"号,然后输入名称,点击...
// 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()); } ...
2. 确保Action类中的getter和setter方法与属性类型匹配。 3. 查看Struts2的日志输出,其中可能包含了错误的详细信息。 4. 使用IDE的代码分析工具检查可能出现的类型匹配问题。 5. 如果使用的是第三方工具,确认其与...
- **布尔类型**:`boolean` 和 `java.lang.Boolean` 可以映射为 `BIT`,但为了更易读,还可以映射为 `yes_no` 或 `true_false` 的 `CHAR(1)` 类型,其中存储 'Y' 或 'N' 来表示真或假。 - **日期时间类型**:`java....
2. **原则二:封装** —— 通过将成员变量声明为`private`并提供公共的getter和setter方法,可以有效地实现数据封装,确保数据的完整性和一致性。 3. **原则三:考虑继承关系** —— 当设计类时考虑到可能存在的...
// 构造函数,getter和setter方法... } public class Child { private String childName; // 构造函数,getter和setter方法... } ``` 2. 数据适配器: 创建一个自定义的ExpandableListAdapter,继承自...
- 对于自定义的Java类,你需要提供合适的getter和setter方法,以便JSON_lib能够正确地序列化和反序列化对象。 3. **处理数组和集合**: - JSON_lib提供了`JSONArray`类来处理JSON数组。你可以通过`JSONArray.from...
### K-means算法的Java实现 #### 一、K-means算法简介 ...以上是K-means算法的Java实现细节,通过这些类的定义和相互协作,可以有效地实现K-means算法的基本功能。这种实现方式简洁明了,便于理解和扩展。
首先,让我们理解Java中的getter和setter方法。这些方法是用于访问和修改对象的私有属性,遵循特定的命名规则。对于非boolean类型的属性,getter方法通常以"get"开头,setter方法以"set"开头。例如: ```java ...
在JavaServer Faces (JSF)开发中,`rich:listShuttle`是RichFaces库中的一个非常实用的组件,主要用于实现列表项的双向选择和移动功能。例如,在用户界面中展示两个列表,并允许用户通过按钮将项目从一个列表移动到...
2. 被模拟的数据最好是plain bean,只提供getter,setter,has,is方法的才可以被模拟 3. 框架默认实现了40个元数据类型的数据模拟器包括: byte.class,Byte.class,byte[].class,Byte[].class, short.class,Short....
在`akcJAVAshopCart`压缩包中,可能包含了实现上述功能的源代码文件,例如`Book.java`、`ShoppingCart.java`以及可能的测试类和配置文件。为了运行和测试这个系统,你需要解压文件,导入到IDE(如IntelliJ IDEA或...
// 构造函数、getter和setter... } ``` 四、Gson使用示例 ```java import com.google.gson.Gson; public class GsonExample { public static void main(String[] args) { // 创建一个对象 Person person = new...
- 使用场景:当需要改变默认的访问策略时,例如,如果类中没有 getter 和 setter 方法但希望使用字段进行映射。 4. **`@XmlAttribute`** - 作用:定义 Java 属性如何映射到 XML 属性。 - 使用场景:当希望将 ...
EasySqlite 在android中使用sqlite的简单方法 用法 [1]。 创建示例对象_你像往常一样创建对象并实现一些接口来使用这个库 :grinning_face_with_smiling_eyes: _ public class ... // getter & setter ....
实验原理:我们使用 Java 语言来编写程序,学习了如何定义类、如何使用构造函数、getter 和 setter 方法、如何使用 toString() 方法等。 实验报告 实验报告 1: 写出顾客类 Customer 的代码。 实验报告 2: 画...
- 例如,包装类提供了getter和setter方法来访问和修改内部封装的基本数据类型,遵循封装原则。 5. **包装类的封装特性** - 封装是面向对象的三大特性之一,包装类实现了对基本数据类型的封装,隐藏了内部细节,...
**ExpandableListView详解** 在Android开发中,`ExpandableListView`是一个非常实用的视图组件,主要用于展示具有层级结构的数据。...熟练掌握其使用和优化技巧,可以提升用户体验,打造更优秀的应用界面。
// 构造函数、getter和setter方法... } ``` 接着,我们创建一个递归方法来生成无限层级的树。这个方法接受当前的层级和父节点,然后根据业务逻辑决定是否创建新的子节点。例如,如果一个节点在某个条件下应有子...