Java はエンティティの各フィールドにデフォルト値を割り当てます

目次

1. 基本バージョン

1. ツール

2. エンティティクラスとテストコード

2. アップグレードバージョン - マルチレイヤーネスト

1. ツール

2. エンティティクラスとテストコード

3. 最終バージョン - さまざまなコレクション

1. ツール

2. エンティティクラスとテストコード


1. 基本バージョン

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 エンティティ クラスのすべてのフィールドにデフォルト値を割り当て、結果を出力します。このツール クラスを使用する前に、ゲッター メソッドとセッター メソッドをエンティティ クラスのすべてのフィールドに追加する必要があることに注意してください。

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
    }
}

2. アップグレードバージョン - マルチレイヤーネスト

        エンティティには複数のネストされたサブエンティティが含まれており、すべてのサブエンティティおよびサブエンティティのフィールドに再帰的にデフォルト値を割り当てることができます。以下は拡張されたツールクラスのコードです

1. ツール

        このツール クラス コードは、任意のエンティティ クラスのすべてのフィールドおよび多層サブエンティティ クラスのすべてのフィールドにデフォルト値を割り当てる機能を実装します。使用方法は上記例と同様ですが、ツールクラスを使用する前にエンティティクラスの全フィールドにゲッターメソッドとセッターメソッドを追加する必要があることに注意してください。同時に、再帰を行う際には、子エンティティクラスの型が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 サブエンティティ クラスのすべてのフィールドにデフォルト値を割り当てます。結果は数値型、文字型、Boolean型のデフォルト値を出力し、日付型は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
    }
}

3. 最終バージョン - さまざまなコレクション

1. ツール

        ツール クラス コードは、エンティティ クラスのすべてのフィールド、マルチレイヤー サブエンティティ クラスのすべてのフィールド、およびさまざまな種類のコレクション フィールドのデフォルト値を実装します。このツール クラスを使用する前に、エンティティ クラスに割り当てる必要があるゲッター メソッドとセッター メソッドを追加しました。同時に、再帰を行う際には、子エンティティクラスの型が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()); // 输出 {}
    }
}

役に立ったら「いいね!」して、良い習慣を身につけてください!

質問、交換、激励などメッセージを残してください!

おすすめ

転載: blog.csdn.net/libusi001/article/details/131383420