Java包装类之实体类不要使用基本类型

[color=rgba(0, 0, 0, 0.75)]今天来记录一下,在项目中因为基本类型,所产生的bug。**U•ェ•*U**

包装类:8种基本类型的包装类

应用场景:数据库建立实体映射多用包装类

这两句话是重点:就是建立实体类禁止使用基本数据量类型!!!而用对应的包装类,

为什么呢,看以下场景。

[Java] 纯文本查看 复制代码

?


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<font style="color:rgb(77, 77, 77)"><font face="&quot"><font style="font-size:16px">/**

 * 8中基本类型的对应包装类’

 * byte  short  int  long   double  float  boolean  char

 * Byte Short Integer Long Double  Float  Boolean  Character

 * 区别:(举例int,其余相同)

 * 1、int默认为0,integer默认为null

 * 2、int是java的基本数据类型,integer是int的包装类

 * 3、integer必须new,int直接使用

 */

/**

 * 场景一:

 * 创建对应数据库的实体类字段

 * 1、创建一个类型(type),对应数据库的一个字段

 * 2、注意:此存在严重问题,基本类型都默认有值。如int 默认为0

 * 3、那在进行数据库新增的时候,如果不填,则会默认为0。

 * 4、会产生严重的bug,应该改为包装类的引用类型

 */

//错误示范

private int type;//代表类型

//正确,设置为integer类型

private Integer typeT;

</font></font></font>

所以,多用包装类进行赋值。
补充:

[Java] 纯文本查看 复制代码

?


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

<font style="color:rgb(77, 77, 77)"><font face="&quot"><font style="font-size:16px">/**

 * 场景二:

 * 自动装箱And自动拆箱

 */

private void testBox() {

    //原本转换方式

    int t = 10;

    Integer ct = new Integer(t);

    int tt = ct.intValue();

    int i = 10;

    //自动装

    Integer c = i;

    //自动拆

    int ic = c;

}

</font></font></font>

笔试题题如下?为什么一个为true,一个为false???

[HTML] 纯文本查看 复制代码

?


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

<font style="color:rgb(77, 77, 77)"><font face="&quot"><font style="font-size:16px">/**

 * 自动装拆箱

 */

public static void main(String[] args) {

    Integer integer0 = 127;

    Integer integer1 = 127;

    System.out.println(integer0 == integer1);//等于true

    Integer integer2 = 128;

    Integer integer3 = 128;

    System.out.println(integer2 == integer3);//等于false

    /** 源码

     *    public static Integer valueOf(int i) {

     *             if (i >= Integer.IntegerCache.low && i <= Integer.IntegerCache.high)

     *                 return Integer.IntegerCache.cache[i + (-Integer.IntegerCache.low)];

     *             return new Integer(i);

     *         }

     * 通过上我们发现,如果他的int值在最高和最低之间,他直接返回cache内的数据

     * 否则, new Integer(i);

     * 那么最高值:?=high 127 ,最低值:?=low -128,

     * 所以:在-128至127内,他们引用的是缓存内的数据,地址相同,所以为true。超过此则为false

     *

     *     private static class IntegerCache {

     *         static final int low = -128;

     *         static final int high;

     *         static final Integer cache[];

     *

     *         static {

     *             // high value may be configured by property

     *             int h = 127;

     *             String integerCacheHighPropValue =

     *                 sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

     *             if (integerCacheHighPropValue != null) {

     *                 try {

     *                     int i = parseInt(integerCacheHighPropValue);

     *                     i = Math.max(i, 127);

     *                     // Maximum array size is Integer.MAX_VALUE

     *                     h = Math.min(i, Integer.MAX_VALUE - (-low) -1);

     *                 } catch( NumberFormatException nfe) {

     *                     // If the property cannot be parsed into an int, ignore it.

     *                 }

     *             }

     *             high = h;

     *

     *             cache = new Integer[(high - low) + 1];

     *             int j = low;

     *             for(int k = 0; k < cache.length; k++)

     *                 cache[k] = new Integer(j++);

     *

     *             // range [-128, 127] must be interned (JLS7 5.1.7)

     *             assert IntegerCache.high >= 127;

     *         }

     *

     *         private IntegerCache() {}

     *     }

     *

     */

}</font></font></font>

注解记录完毕,这些在日常开发中还是很需要我们注意的。

原文地址:https://www.cnblogs.com/zhuxiaopijingjing/p/12258423.html

时间: 2024-11-05 21:40:33

Java包装类之实体类不要使用基本类型的相关文章

Java中遍历实体类(处理MongoDB)

在实际过程中,经常要将实体类进行封装,尤其是处理数据库的过程中:因此,对于遍历实体类能够与数据库中的一行数据对应起来. 我是使用的环境是Spring boot,访问的数据库时MongoDB 实体类遍历: 1 //java中遍历实体类,获取属性名和属性值 2 public static void testReflect(Object model) throws Exception{ 3 for (Field field : model.getClass().getDeclaredFields())

领域模型中的实体类分为四种类型:VO、DTO、DO、PO

http://kb.cnblogs.com/page/522348/ 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来. DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布

转:领域模型中的实体类分为四种类型:VO、DTO、DO、PO

经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实际应用情况两个角度,对这几个概念进行简析.得出的主要结论是:在项目应用中,VO对应于页面上需要显示的数据(表单),DO对应于数据库中存储的数据(数据表),DTO对应于除二者之外需要进行传递的数据.一.实体类百度百科中对于实体类的定义如下:实体类的主要职责是存储和管理系统内部的信息,它也可以有行为,甚至很复杂的行为,但这些行为必须与它所代表的实体对象密切相关.根据以上定义,我们可以了解到,实体类有两方面内容,存储数据和执行

javabean(实体类)转Map类型

从网上"風亦飞"的导出EXCEL的源码提取出来的,觉得很好用,分享一下给大家,主要看beanToMap方法就OK了 /*下面是从poi导出EXCEL的一部分代码,主要将传参数的list转换为map类型,list装载的数据是从数据库取出来的,可以是数组类型,也可以是map类型,也可以是实体类*/ public static TableData createTableData(List list,TableHeaderMetaData headMeta,String[] fields){

java中遍历实体类属性和类型

public static void testReflect(Object model) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ Field[] field = model.getClass().getDeclaredFields(); //获取实体类的所有属性,返回Field数组 for(int j=0 ; j<field

Java 中常用的类:包括基本类型的包装类、Date 类、SimpleDateFormat 类、 Calendar 类、 Math 类

JAVA中的包装类 包装类里没有String,它是引用数据类型 基本类型是不能调用方法的,而其包装类具有很多方法 包装类主要提供了两大类方法: 1. 将本类型和其他基本类型进行转换的方法 2. 将字符串和本类型及包装类互相转换的方法 基本类型 对应的包装类 byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean Integer m=new Intege

java反射对实体类取值和赋值

项目中需要过滤前面表单页面中传过来的实体类的中的String类型变量的前后空格过滤,由于前几天看过一个其他技术博客的的java反射讲解,非常受益.于是,哈哈哈 public static <T> void modelTrim(T model){ Class<T> clazz = (Class<T>) model.getClass(); //获取所有的bean中所有的成员变量 Field[] fields = clazz.getDeclaredFields(); for(

grpc proto文件生成java、.net实体类以及客户端代码

背景 工作中对接对方服务是GRPC,对方只提供了proto契约文件,需要自己生成对应的实体类以及客户端代码,故记录下操作流程. Java 代码生成 实体类: 通过protoc插件生成实体类 在 https://github.com/protocolbuffers/protobuf/releases 下载对应版本的protoc工具解压,我这边用的是3.1.0版本的 proto文件拷贝至protoc同目录,执行如下命令: protoc --java_out=./java/ hello.proto 对

对实体类的所有String类型的成员变量值trim

使用反射,可以对实体类中的所有String类型的成员变量的值执行trim操作 (1)trim /***  * 对object中的所有成员变量的值,执行trim操作<br>  * 即去掉首尾的空格  * @param obj  * @throws SecurityException  * @throws NoSuchFieldException  * @throws IllegalArgumentException  * @throws IllegalAccessException  */ pu