淺談Java對象禁止使用基本類型
1. 關(guān)于POJO類屬性為基本類型存在的問題
在項(xiàng)目開發(fā)中遇到的問題,定義POJO類的時候有些屬性定義為了基本數(shù)據(jù)類型,比如long,short,int,double,float等數(shù)據(jù)相關(guān)的屬性,導(dǎo)致在創(chuàng)建對象的時候,明明沒有set值,卻使用了默認(rèn)值,導(dǎo)致數(shù)據(jù)構(gòu)建錯誤,甚至存儲,更新數(shù)據(jù)出錯。
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 類屬性沒有初值是提醒使用者在需要使用時,必須自己顯式地進(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)用不成功時,返回的是默認(rèn)值,頁面顯示為 0%,這是不合理的,應(yīng)該顯示成中劃線-。所以包裝數(shù)據(jù)類型的 null 值,能夠表示額外的信息,如:遠(yuǎn)程調(diào)用失敗,異常退出。
總結(jié)來說就是POJO類禁止使用基本數(shù)據(jù)類型,手冊中給的案例是交易的時候有些數(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í)例后,如果沒有沒有顯示的為每個元素賦值,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)致不賦值時依然被默認(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中BigDecimal序列化科學(xué)計(jì)數(shù)法前端展示問題踩坑實(shí)戰(zhàn)
BigDecimal是處理高精度的浮點(diǎn)數(shù)運(yùn)算的常用的一個類當(dāng)需要將BigDecimal中保存的浮點(diǎn)數(shù)值打印出來,這篇文章主要給大家介紹了關(guān)于Java中BigDecimal序列化科學(xué)計(jì)數(shù)法前端展示問題踩坑的相關(guān)資料,需要的朋友可以參考下2024-04-04java根據(jù)不同的參數(shù)調(diào)用不同的實(shí)現(xiàn)類操作
這篇文章主要介紹了java根據(jù)不同的參數(shù)調(diào)用不同的實(shí)現(xiàn)類操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09Java開發(fā)學(xué)習(xí)之Bean的生命周期詳解
從創(chuàng)建到消亡的完整過程,例如人從出生到死亡的整個過程就是一個生命周期。本文將通過示例為大家詳細(xì)講講Bean的生命周期,感興趣的可以學(xué)習(xí)一下2022-06-06在java中main函數(shù)如何調(diào)用外部非static方法
這篇文章主要介紹了在java中main函數(shù)如何調(diào)用外部非static方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12Spring接口版本控制方案及RequestMappingHandlerMapping接口介紹(最新推薦)
RequestMappingHandlerMapping接口是Spring MVC中的一個核心組件,負(fù)責(zé)處理請求映射和處理器的匹配這篇文章主要介紹了Spring接口版本控制方案及RequestMappingHandlerMapping接口介紹,需要的朋友可以參考下2024-07-07簡單理解Java的垃圾回收機(jī)制與finalize方法的作用
這篇文章主要介紹了簡單理解Java的垃圾回收機(jī)制與finalize方法的作用,著重講解了Java的GC銷毀對象的過程,需要的朋友可以參考下2015-11-11Java并發(fā)編程之LongAdder執(zhí)行情況解析
這篇文章主要為大家介紹了Java并發(fā)編程之LongAdder執(zhí)行情況解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04SpringBoot?Schedule調(diào)度任務(wù)的動態(tài)管理
Scheduled定時任務(wù)是Spring?boot自身提供的功能,所以不需要引入Maven依賴包,下面這篇文章主要給大家介紹了關(guān)于SpringBoot通過@Scheduled實(shí)現(xiàn)定時任務(wù)以及問題解決的相關(guān)資料,需要的朋友可以參考下2023-02-02SpringBoot?mybatis-plus使用json字段實(shí)戰(zhàn)指南
在現(xiàn)代應(yīng)用開發(fā)中經(jīng)常會使用JSON格式存儲和傳輸數(shù)據(jù),為了便捷地處理數(shù)據(jù)庫中的JSON字段,MyBatis-Plus提供了強(qiáng)大的JSON處理器,這篇文章主要給大家介紹了關(guān)于SpringBoot?mybatis-plus使用json字段的相關(guān)資料,需要的朋友可以參考下2024-01-01Java SpringBoot Validation用法案例詳解
這篇文章主要介紹了Java SpringBoot Validation用法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09