java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java实体字段赋默认值

Java给实体每一个字段赋默认值详细代码示例

作者:慕白Lee

这篇文章主要给大家介绍了关于Java给实体每一个字段赋默认值的相关资料,在编程过程中有时会出现这样一种情况,在查询无结果时我们需要给实体赋默认值,需要的朋友可以参考下

一、初级版

1、工具类

使用反射机制实现任意实体类字段的默认值赋值功能

import java.lang.reflect.Field;
public class EntityDefaultValues {
    /**
     * 为指定实体类的所有字段赋默认值
     * @param entityClass 实体类的Class对象
     * @param <T> 实体类的类型
     * @throws IllegalAccessException 当访问实体类字段失败时抛出
     * @throws InstantiationException 当创建实体类实例失败时抛出
     */
    public static <T> T setDefaultValues(Class<T> entityClass) throws IllegalAccessException, InstantiationException {
        // 使用newInstance方法创建实体类的实例
        T entity = entityClass.newInstance();
        // 获取实体类的所有字段
        Field[] fields = entityClass.getDeclaredFields();
        // 遍历所有字段并为其赋默认值
        for(Field field : fields){
            field.setAccessible(true);
            Object value = getDefaultFieldValue(field.getType());
            field.set(entity, value);
        }
        return entity;
    }
    /**
     * 获取指定数据类型的默认值
     * @param type 数据类型的Class对象
     * @return 数据类型的默认值
     */
    private static Object getDefaultFieldValue(Class<?> type) {
        if(type == int.class || type == Integer.class){
            return 0;
        }else if(type == long.class || type == Long.class){
            return 0L;
        }else if(type == float.class || type == Float.class){
            return 0.0F;
        }else if(type == double.class || type == Double.class){
            return 0.0D;
        }else if(type == byte.class || type == Byte.class){
            return (byte)0;
        }else if(type == short.class || type == Short.class){
            return (short)0;
        }else if(type == boolean.class || type == Boolean.class){
            return false;
        }else if(type == char.class || type == Character.class){
            return '\u0000';
        }else{
            return null; // 引用类型默认为null
        }
    }
}

2、实体类与测试代码

使用EntityDefaultValues工具类为TestEntity实体类的所有字段赋默认值,并输出结果。需要注意的是,使用该工具类前,必须为实体类的所有字段添加了getter和setter方法。

public class TestEntity {
    int id;
    String name;
    boolean finished;
    // 构造函数省略
    // 必须添加getter和setter方法
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public boolean isFinished() {
        return finished;
    }
    public void setFinished(boolean finished) {
        this.finished = finished;
    }
}
// 测试
public class Test {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        TestEntity entity = EntityDefaultValues.setDefaultValues(TestEntity.class);
        System.out.println(entity.getId()); // 输出 0
        System.out.println(entity.getName()); // 输出 null
        System.out.println(entity.isFinished()); // 输出 false
    }
}

二、升级版-多层嵌套

实体包含多层嵌套的子实体,可以通过递归的方式,为所有子实体和子实体的字段赋默认值。以下是扩展后的工具类代码

1、工具类

此工具类代码实现了为任意实体类的所有字段以及多层子实体类的所有字段赋默认值的功能。使用方法与上面的示例相同,需要注意的是,使用该工具类前,必须为实体类的所有字段添加了getter和setter方法。同时,在进行递归时,需要判断子实体类的类型是否具有ClassLoader属性,以此来判断其是否是一个实体类。如果是实体类,则使用递归方式为子实体类的字段赋默认值。

import java.lang.reflect.Field;
public class EntityDefaultValues {
    /**
     * 为指定实体类的所有字段以及多层子实体类的字段赋默认值
     * @param entityClass 实体类的Class对象
     * @param <T> 实体类的类型
     * @throws IllegalAccessException 当访问实体类字段失败时抛出
     * @throws InstantiationException 当创建实体类实例失败时抛出
     */
    public static <T> T setDefaultValues(Class<T> entityClass) throws IllegalAccessException, InstantiationException {
        // 使用newInstance方法创建实体类的实例
        T entity = entityClass.newInstance();
        // 获取实体类的所有字段
        Field[] fields = entityClass.getDeclaredFields();
        // 遍历所有字段并为其赋默认值
        for(Field field : fields){
            field.setAccessible(true);
            // 如果该字段是一个实体类
            if(field.getType().getClassLoader() != null){
                // 使用递归方式为子实体类的字段赋默认值
                Object subEntity = setDefaultValues(field.getType());
                field.set(entity, subEntity);
            }else{
                Object value = getDefaultFieldValue(field.getType());
                field.set(entity, value);
            }
        }
        return entity;
    }
    /**
     * 获取指定数据类型的默认值
     * @param type 数据类型的Class对象
     * @return 数据类型的默认值
     */
    private static Object getDefaultFieldValue(Class<?> type) {
        if(type == int.class || type == Integer.class){
            return 0;
        }else if(type == long.class || type == Long.class){
            return 0L;
        }else if(type == float.class || type == Float.class){
            return 0.0F;
        }else if(type == double.class || type == Double.class){
            return 0.0D;
        }else if(type == byte.class || type == Byte.class){
            return (byte)0;
        }else if(type == short.class || type == Short.class){
            return (short)0;
        }else if(type == boolean.class || type == Boolean.class){
            return false;
        }else if(type == char.class || type == Character.class){
            return '\u0000';
        }else{
            return null; // 引用类型默认为null
        }
    }
}

2、实体类与测试代码

使用EntityDefaultValues工具类为TestEntity实体类及其内部SubEntity子实体类的所有字段赋默认值。结果输出默认的数值类型、字符类型和布尔类型的默认值,日期类型为null,引用类型也为null。

public class TestEntity {
    int id;
    String name;
    boolean finished;
    Date createTime;
    SubEntity subEntity;
    // 构造函数省略
    // 必须添加getter和setter方法
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public boolean isFinished() {
        return finished;
    }
    public void setFinished(boolean finished) {
        this.finished = finished;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public SubEntity getSubEntity() {
        return subEntity;
    }
    public void setSubEntity(SubEntity subEntity) {
        this.subEntity = subEntity;
    }
}
public class SubEntity {
    int subId;
    String subName;
    // 构造函数省略
    // 必须添加getter和setter方法
    public int getSubId() {
        return subId;
    }
    public void setSubId(int subId) {
        this.subId = subId;
    }
    public String getSubName() {
        return subName;
    }
    public void setSubName(String subName) {
        this.subName = subName;
    }
}
// 测试
public class Test {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        TestEntity entity = EntityDefaultValues.setDefaultValues(TestEntity.class);
        System.out.println(entity.getId()); // 输出 0
        System.out.println(entity.getName()); // 输出 null
        System.out.println(entity.isFinished()); // 输出 false
        System.out.println(entity.getCreateTime()); // 输出 null
        System.out.println(entity.getSubEntity().getSubId()); // 输出 0
        System.out.println(entity.getSubEntity().getSubName()); // 输出 null
    }
}

三、最终版-各种集合

1、工具类

工具类代码实现了为任意实体类的所有字段以及多层子实体类的所有字段、各种类型的集合字段赋默认值,需要注意的是,使用该工具类前,必须为实体类的所有字段添加了getter和setter方法。同时,在进行递归时,需要判断子实体类的类型是否具有ClassLoader属性,以此来判断其是否是一个实体类。对于各种类型的集合字段,需要通过判断集合的具体实现类来确定其默认值及具体实现类。对于基本类型和引用类型的字段,可以使用getDefaultFieldValue()方法获取其默认值。

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class EntityDefaultValues {
    /**
     * 为指定实体类的所有字段以及多层子实体类的字段、各种集合类型的字段赋默认值
     * @param entityClass 实体类的Class对象
     * @param <T> 实体类的类型
     * @throws IllegalAccessException 当访问实体类字段失败时抛出
     * @throws InstantiationException 当创建实体类实例失败时抛出
     */
    public static <T> T setDefaultValues(Class<T> entityClass) throws IllegalAccessException, InstantiationException {
        // 使用newInstance方法创建实体类的实例
        T entity = entityClass.newInstance();
        // 获取实体类的所有字段
        Field[] fields = entityClass.getDeclaredFields();
        // 遍历所有字段并为其赋默认值
        for(Field field : fields){
            field.setAccessible(true);
            Object value = null;
            Class<?> fieldType = field.getType();
            // 如果该字段是一个集合类型
            if(Collection.class.isAssignableFrom(fieldType)){
                // 判断集合类型的具体实现类
                if(List.class.isAssignableFrom(fieldType)){
                    // 创建一个空的List对象
                    value = new ArrayList<>();
                }else if(Map.class.isAssignableFrom(fieldType)){
                    // 创建一个空的HashMap对象
                    value = new HashMap<>();
                }else{
                    // 其他类型的集合使用空的Collection对象
                    value = new ArrayList<>();
                }
                field.set(entity, value);
            }
            // 如果该字段是一个实体类
            else if(fieldType.getClassLoader() != null){
                // 使用递归方式为子实体类的字段赋默认值
                Object subEntity = setDefaultValues(fieldType);
                field.set(entity, subEntity);
            }
            // 如果该字段是一个基本类型或引用类型
            else{
                value = getDefaultFieldValue(fieldType);
                field.set(entity, value);
            }
        }
        return entity;
    }
    /**
     * 获取指定数据类型的默认值
     * @param type 数据类型的Class对象
     * @return 数据类型的默认值
     */
    private static Object getDefaultFieldValue(Class<?> type) {
        if(type == int.class || type == Integer.class){
            return 0;
        }else if(type == long.class || type == Long.class){
            return 0L;
        }else if(type == float.class || type == Float.class){
            return 0.0F;
        }else if(type == double.class || type == Double.class){
            return 0.0D;
        }else if(type == byte.class || type == Byte.class){
            return (byte)0;
        }else if(type == short.class || type == Short.class){
            return (short)0;
        }else if(type == boolean.class || type == Boolean.class){
            return false;
        }else if(type == char.class || type == Character.class){
            return '\u0000';
        }else{
            return null; // 引用类型默认为null
        }
    }
}

2、实体类与测试代码

使用EntityDefaultValues工具类为TestEntity实体类及其内部SubEntity子实体类的所有字段赋默认值。结果输出默认的数值类型、字符类型和布尔类型的默认值,日期类型为null,引用类型也为null,List和Map类型为默认的空集合对象。需要注意的是,在进行递归时,需要判断子实体类的类型是否具有ClassLoader属性,以此来判断其是否是一个实体类。如果是实体类,则使用递归方式为子实体类的字段赋默认值。同时,在为List和Map类型的字段赋默认值时,需要通过判断集合的具体实现类来确定其默认值及具体实现类。

import java.util.Date;
import java.util.List;
import java.util.Map;
public class TestEntity {
    int id;
    String name;
    boolean finished;
    Date createTime;
    SubEntity subEntity;
    List<SubEntity> subEntityList;
    Map<String, SubEntity> subEntityMap;
    // 构造函数省略
    // 必须添加getter和setter方法
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public boolean isFinished() {
        return finished;
    }
    public void setFinished(boolean finished) {
        this.finished = finished;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public SubEntity getSubEntity() {
        return subEntity;
    }
    public void setSubEntity(SubEntity subEntity) {
        this.subEntity = subEntity;
    }
    public List<SubEntity> getSubEntityList() {
        return subEntityList;
    }
    public void setSubEntityList(List<SubEntity> subEntityList) {
        this.subEntityList = subEntityList;
    }
    public Map<String, SubEntity> getSubEntityMap() {
        return subEntityMap;
    }
    public void setSubEntityMap(Map<String, SubEntity> subEntityMap) {
        this.subEntityMap = subEntityMap;
    }
}
public class SubEntity {
    int subId;
    String subName;
    // 构造函数省略
    // 必须添加getter和setter方法
    public int getSubId() {
        return subId;
    }
    public void setSubId(int subId) {
        this.subId = subId;
    }
    public String getSubName() {
        return subName;
    }
    public void setSubName(String subName) {
        this.subName = subName;
    }
}
// 测试
public class Test {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        TestEntity entity = EntityDefaultValues.setDefaultValues(TestEntity.class);
        System.out.println(entity.getId()); // 输出 0
        System.out.println(entity.getName()); // 输出 null
        System.out.println(entity.isFinished()); // 输出 false
        System.out.println(entity.getCreateTime()); // 输出 null
        System.out.println(entity.getSubEntity().getSubId()); // 输出 0
        System.out.println(entity.getSubEntity().getSubName()); // 输出 null
        System.out.println(entity.getSubEntityList()); // 输出 []
        System.out.println(entity.getSubEntityMap()); // 输出 {}
    }
}

总结

到此这篇关于Java给实体每一个字段赋默认值的文章就介绍到这了,更多相关Java实体字段赋默认值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文