欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Java對象禁止使用基本類型

 更新時間:2023年02月03日 11:03:45   作者:靖節(jié)先生  
本文主要介紹了淺談Java對象禁止使用基本類型,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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)文章

最新評論