java - 一个类字段有30个,现在只想用中间的10个字段,单独组成一个类,如何设计?

查看:100
本文介绍了java - 一个类字段有30个,现在只想用中间的10个字段,单独组成一个类,如何设计?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

一个类字段有30个,现在只想用中间的10个字段,单独组成一个类,如何设计?

问题描述:
类A 字段 30个
类B 字段 10个(全部取自类A)
新组成的10个字段可能会变化,两个类有关系,不想以后字段变动,两个类都需要改,有什么好办法?

解决方案

类A 字段 30个
类B 字段 10个(全部取自类A)

那就应该是A继承B。A只需要全部30个中B没有的20个字段

或者弄一个SubFields的Map,通过反射获取A的字段。

public abstract class SubFieldMap<T> extends HashMap<String,Object> {

        private static final long serialVersionUID = 123455;

        @SuppressWarnings("all")
        public SubFieldMap(T bean) throws ReflectiveOperationException {
            super();

            for(String fieldName : getSubFields()) {
                Field field = bean.getClass().getField(fieldName);
                Method getterMethod = getGetterMethod((Class<T>) bean.getClass(),field);
                
                Object value = getterMethod.invoke(bean);
                
                super.put(fieldName,value);
            }
        }

        protected abstract List<String> getSubFields();

        private Method getGetterMethod(Class<T> beanClass, Field field) throws ReflectiveOperationException {
            if(!field.getDeclaringClass().equals(beanClass))
                throw new NoSuchFieldException("field " + field.getName() + " does not belong class " + beanClass.getName());

            String setterMethodName = field.getName();
            setterMethodName = StringUtils.upperCase(StringUtils.left(setterMethodName,1)) + StringUtils.right(setterMethodName,setterMethodName.length()-1);
            setterMethodName = "get" + setterMethodName;

            return beanClass.getDeclaredMethod(setterMethodName);

        }
    }

创建B类的时候,覆盖getSubFields方法,提供需要的字段名。创建B对象的时候,构造方法传进A类的实例,就自动把subFields的属性put到Map里面了:

public class A {
        private String aaa;
        private String bbb;
        private Integer ccc;

        public String getAaa() {
            return aaa;
        }

        public void setAaa(String aaa) {
            this.aaa = aaa;
        }

        public String getBbb() {
            return bbb;
        }

        public void setBbb(String bbb) {
            this.bbb = bbb;
        }

        public Integer getCcc() {
            return ccc;
        }

        public void setCcc(Integer ccc) {
            this.ccc = ccc;
        }
    }
    
        public class B extends SubFieldMap<A> {

        public B(A bean) throws ReflectiveOperationException {
            super(bean);
        }

        @Override
        protected List<String> getSubFields() {
            return Arrays.asList("aaa","ccc");
        }
    }

这篇关于java - 一个类字段有30个,现在只想用中间的10个字段,单独组成一个类,如何设计?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆