boolean值正确的setter/getter方法

引入

为什么要讲这个问题呢?项目遇到一个boolean值,结果使用fastjson将对象转换为json字符串时发现boolean值的字段变了。

具体看如下示例代码:

/**
 * 测试boolean值命名不规范导致的问题
 * @ClassName Test 
 * @author zhangshun
 * @date 2017年8月16日 下午5:40:13
 */
public class Test {
    /**
     * 命名不规范,不应该加is
     */
    private boolean isTest;
    /**
     * 命名规范
     */
    private boolean url;

    // 以下是Eclipse生成的isTest的setter/getter方法,很明显,也跟着出问题
    public boolean isTest() {
        return isTest;
    }
    public void setTest(boolean isTest) {
        this.isTest = isTest;
    }

    // 这个是正常的
    public boolean isUrl() {
        return url;
    }
    public void setUrl(boolean url) {
        this.url = url;
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.setTest(false);
        test.setUrl(true);
        // 结果:{"test":false,"url":true}, 很明显isTest变成了test
        System.out.println(JSON.toJSONString(test));
    }
}

这里,结果出现了变化!

原因

因为boolean值属性没有按照JavaBean规范进行命名。JavaBean规范这样说:如果一个属性是boolean值,假设名为property,则其setter方法应该是setProperty,其getter方法应该为isProperty。

当我们对isTest这个boolean类型的属性使用Eclipse自动生成setter/getter方法时,其生成的getter方法时isTest,这样的话,fastjson就会以为这个属性是test,从而输出结果是test。

解决

  1. 方式1:规范boolean值命名,将isTest调整为test,这样其结果为{“test”:false,”url”:true}
  2. 方式2:规范boolean值的getter方法,将isTest调整为isIsTest方法,这样其结果为{“isTest”:false,”url”:true}

参考:
1. github上fastjson对boolean值处理的问题

猜你喜欢

转载自blog.csdn.net/u012383839/article/details/79664912