淺談Java對象禁止使用基本類型
1. 關(guān)于POJO類屬性為基本類型存在的問題
在項(xiàng)目開發(fā)中遇到的問題,定義POJO類的時(shí)候有些屬性定義為了基本數(shù)據(jù)類型,比如long,short,int,double,float等數(shù)據(jù)相關(guān)的屬性,導(dǎo)致在創(chuàng)建對象的時(shí)候,明明沒有set值,卻使用了默認(rèn)值,導(dǎo)致數(shù)據(jù)構(gòu)建錯(cuò)誤,甚至存儲,更新數(shù)據(jù)出錯(cuò)。
2. Java開發(fā)手冊關(guān)于POJO類屬性規(guī)范
阿里巴巴《Java開發(fā)手冊》泰山版,編程規(guī)約,OOP規(guī)約,第12條規(guī)定:
12.關(guān)于基本數(shù)據(jù)類型與包裝數(shù)據(jù)類型的使用標(biāo)準(zhǔn)如下:
1) 【強(qiáng)制】所有的 POJO 類屬性必須使用包裝數(shù)據(jù)類型。
2) 【強(qiáng)制】RPC 方法的返回值和參數(shù)必須使用包裝數(shù)據(jù)類型。
3) 【推薦】所有的局部變量使用基本數(shù)據(jù)類型。
說明:POJO 類屬性沒有初值是提醒使用者在需要使用時(shí),必須自己顯式地進(jìn)行賦值,任何 NPE 問題,或者入庫檢查,都由使用者來保證。
正例:數(shù)據(jù)庫的查詢結(jié)果可能是 null,因?yàn)樽詣硬鹣?,用基本?shù)據(jù)類型接收有 NPE 風(fēng)險(xiǎn)。
反例:某業(yè)務(wù)的交易報(bào)表上顯示成交總額漲跌情況,即正負(fù) x%,x 為基本數(shù)據(jù)類型,調(diào)用的 RPC 服務(wù),調(diào)用不成功時(shí),返回的是默認(rèn)值,頁面顯示為 0%,這是不合理的,應(yīng)該顯示成中劃線-。所以包裝數(shù)據(jù)類型的 null 值,能夠表示額外的信息,如:遠(yuǎn)程調(diào)用失敗,異常退出。
總結(jié)來說就是POJO類禁止使用基本數(shù)據(jù)類型,手冊中給的案例是交易的時(shí)候有些數(shù)據(jù)null具有特殊含義,會做特殊處理,比如rpc調(diào)用失敗,異常退出等,但是如果采用的是基本數(shù)據(jù)類型就會跳過這些邏輯處理,因?yàn)榛緮?shù)據(jù)類型具有默認(rèn)值。
3. 基本數(shù)據(jù)類型默認(rèn)值
1、整數(shù)類型(byte、short、int、long)的基本類型變量的默認(rèn)值為0。
2、單精度浮點(diǎn)型(float)的基本類型變量的默認(rèn)值為0.0f。
3、雙精度浮點(diǎn)型(double)的基本類型變量的默認(rèn)值為0.0d。
4、字符型(char)的基本類型變量的默認(rèn)為 “/u0000”。
5、布爾性的基本類型變量的默認(rèn)值為 false。
6、引用類型的變量是默認(rèn)值為 null。
7、數(shù)組引用類型的變量的默認(rèn)值為 null。除關(guān)鍵數(shù)組變量的實(shí)例后,如果沒有沒有顯示的為每個(gè)元素賦值,Java 就會把該數(shù)組的所有元素初始化為其相應(yīng)類型的默認(rèn)值。
4. 測試驗(yàn)證
User對象
package com.zrj.tools.framework.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
?* 用戶對象
?*
?* @author zrj
?* @since 2022/11/29
?**/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
? ? private Long id;
? ? private String name;
? ? private int age;
? ? private long phone;
? ? private short phone2;
? ? private double userTime;
? ? private float totalTime;
}BeanUtils
package com.zrj.tools.framework.utils;
import cn.hutool.core.bean.BeanUtil;
import com.zrj.tools.framework.entity.Customer;
import com.zrj.tools.framework.entity.User;
/**
?* 對象構(gòu)建
?*
?* @author zrj
?* @since 2023/1/4
?**/
public class BeanUtils extends BeanUtil {
? ? /**
? ? ?* 對象的基本數(shù)據(jù)類型帶有默認(rèn)值,導(dǎo)致不賦值時(shí)依然被默認(rèn)賦值
? ? ?*
? ? ?* @param args
? ? ?*/
? ? public static void main(String[] args) {
? ? ? ? User user = User.builder().id(18L).name("jerry").build();
? ? ? ? //輸出結(jié)果:User(id=18, name=jerry, age=0, phone=0, phone2=0, userTime=0.0, totalTime=0.0)
? ? ? ? System.out.println(user);
? ? ? ? Customer customer = convert(user, Customer.class);
? ? ? ? System.out.println(customer);
? ? }
? ? /**
? ? ?* 基于hutool的對象拷貝
? ? ?*
? ? ?* @param source ? ? ? ? ? 源對象
? ? ?* @param target ? ? ? ? ? 目標(biāo)對象
? ? ?* @param ignoreProperties 忽略的字段
? ? ?* @param <T>
? ? ?* @return
? ? ?*/
? ? public static <T> T convert(Object source, Class<T> target, String... ignoreProperties) {
? ? ? ? if (source == null) {
? ? ? ? ? ? return null;
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? T t = target.newInstance();
? ? ? ? ? ? copyProperties(source, t, ignoreProperties);
? ? ? ? ? ? return t;
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? throw new RuntimeException(e);
? ? ? ? }
? ? }
}初始化構(gòu)建的對象,基本類型會被賦默認(rèn)值。
到此這篇關(guān)于淺談Java對象禁止使用基本類型的文章就介紹到這了,更多相關(guān)Java對象禁止使用基本類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java編程之AC自動機(jī)工作原理與實(shí)現(xiàn)代碼
這篇文章主要介紹了java編程之AC自動機(jī)的有關(guān)內(nèi)容,涉及其應(yīng)用場景,運(yùn)行原理,運(yùn)行過程,構(gòu)造方法及Java中的實(shí)現(xiàn)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
在Spring Boot中如何使用數(shù)據(jù)緩存
本篇文章主要介紹了在Spring Boot中如何使用數(shù)據(jù)緩存,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04
mybatis-plus實(shí)體類主鍵策略有3種(小結(jié))
這篇文章主要介紹了mybatis-plus實(shí)體類主鍵策略有3種(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Java中實(shí)現(xiàn)String字符串用逗號隔開
這篇文章主要介紹了Java中實(shí)現(xiàn)String字符串用逗號隔開,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
在Mybatis中association標(biāo)簽多層嵌套的問題
這篇文章主要介紹了在Mybatis中association標(biāo)簽多層嵌套的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
手把手帶你實(shí)現(xiàn)一個(gè)萌芽版的Spring容器
大家好,我是老三,Spring是我們最常用的開源框架,經(jīng)過多年發(fā)展,Spring已經(jīng)發(fā)展成枝繁葉茂的大樹,讓我們難以窺其全貌,這節(jié),我們回歸Spring的本質(zhì),五分鐘手?jǐn)]一個(gè)Spring容器,揭開Spring神秘的面紗2022-03-03

