有没有方法可以给对象动态添加属性

JSP_killmylife 2021-03-21 02:07:31
比如我现在有个通用的cars类,业务需求是要我在这个类上动态拓展,假如我是个4S店,我有卖比亚迪,也有特斯拉,我需要一个通用类来被这两种车继承,假如我再加个小鹏,那么我就需要在源码的基础上进行添加 Xpeng extends cars,目前就是这种状况。有没有办法可以动态添加而不用动源码的一劳永逸的办法?
...全文
1187 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
yayamami2008 2021-03-27
  • 打赏
  • 举报
回复
需要面向接口編程,在runtime的時候返回需要的實力 Car byd = Car.getCar("byd") Car xPeng = Car.getCar("xPeng")
老王就是我 2021-03-27
  • 打赏
  • 举报
回复
引用 25 楼 JSP_killmylife 的回复:
[quote=引用 23 楼 老王就是我 的回复:][quote=引用 19 楼 JSP_killmylife 的回复:][quote=引用 18 楼 JSP_killmylife 的回复:][quote=引用 16 楼 老王就是我 的回复:][quote=引用 15 楼 JSP_killmylife 的回复:][quote=引用 13 楼 老王就是我 的回复:][quote=引用 12 楼 老王就是我 的回复:]如果要实现完全动态,那绝对做不到,至少java做不到。但如果可以预先定义n个车型,预先定义四个车型:A、B、C、D,前端只能选择这四个,那可以试下模板模式或者策略模式
类似这种

class interface Car{
    int type=0;
    void test();
}

class A interface Car{
    int type=1;
    public void test(){
        sout("处理逻辑")
    }
}
class B interface Car{ int type=1; public void test(){ sout("处理逻辑") } } [/code] 使用的话,可以这样

@auto...(自动注入那个东东)
private Car[] cars;

public void test(int type){
    for(Car car:cars){
        if(car.type=type){
            car.test();
        }
    }
}
大概这样,后续维护只需要管car的实现类,如果有添加新的车型就加一个实现[/quote] 大佬,能用hashmap来维护那些新增的属性吗?新增的属性用另一张表来维护。毕竟新增过后除了库存/金额/创/修时间,其他都是静态的。[/quote] 如果有独有的属性,就在A、B、C上面加不就好了吗?如果是共有的,就在car上加,不懂你在问啥[/quote] 因为我在某工业管理软件上面看到他们所有的自定义零组件都是基于系统自带的通用模板ITEM上面拓展的,你只需在前端选择添加属性,选择属性类型就能持久化你自定义的零组件。[/quote] 换句话说,其实不能用汽车产品族来举例我这个问题,应该用汽车零件举例,我的目的是学习像这种系统一样,所有的零件都基于系统自带的始类型创建,比如我的始类型只有id,ver,creat/edit-time,我通过前端添加属性,使之成为螺丝,轮胎,底盘。[/quote] 属性的类型不是问题,问题在于逻辑处理要怎么做?目前已知所有编程语言都只能预设,假设有A、B、C、D、E等等的属性,然后他们组合成什么样,要处理成什么样。因为要进行逻辑处理,所有的属性类型都必须预设,比如说我有螺丝、螺母、螺丝刀、活塞这几个零件做了逻辑处理,那么我就只会开放这几个零件的选择,因为没做处理,所以前端是不允许添加这几个零件以外的属性。 而我举的车的例子,它只是一个例子而已,只是告诉你实现思路,并不是一个成熟的可用的产品。把A、B、C车子换成劳斯莱斯、奔驰、宝马等(原谅我车盲),这三台车子共有的属性很多,有车窗、车盖、车标、方向盘啥的,但也会有一些独有的设计是其他厂商没有的,独有的设计写在A、B、C实现类里,那些共有的属性(车窗、车盖、车标啥的)写在CAR接口上[/quote] 我知道这个思路,但不灵活啊。[/quote] 只要需要处理独有属性,只能这么写,无论哪个编程语言都差不多。除非你那些独有属性是不需要做任何处理,只要写进数据库就行的
JSP_killmylife 2021-03-26
  • 打赏
  • 举报
回复
引用 20 楼 冰思雨 的回复:
Java 是面向对象的编程语言,它的特征就是存在 类 和 对象 的概念。 类就是数据结构的规范,你的数据存储一定要按照 类 声明里面的格式来存放。 项目原有的 类继承 的方式,来存储数据,是一个很直观的办法。 优点是,简单直接,代码的可读性很高,初级选手也容易上手,后期维护没有什么门槛。 缺点也会显而易见,就是新类型的车子过来,就要基于新车型的特点创建对应的实现类。 一般状况下,我们是按照使用场景来处理这种问题的。 如果车型更新不频繁,可以容忍添加一个新车型就必须进行一次版本升级,那就按照原有方案进行开发即可。换句话说,在开发的时候,你就把现在所有能涉及到的车型对应的类,就建立了就好,反正,一年也出不了几个新车型,或者说,一年也更新不了几个程序版本。 如果车型更新频繁,我们会换个角度来搞定这个事情。将车型的属性信息提取出来封装成类,而不是具体的车型封装成类。换句话说就是,以前是一个车型一个类,现在嘛,一个车型一个对象即可。这样的话,车型这个类会比较稳定,基本上没有变动的可能性,然后,一个车型 new 一个对象即可。 汽车的类也要调整,以前是一个车型一个类,new 这个类的对象,就是车的对象,现在嘛,车型是对象,车对象里面包含一个车类型对象的引用即可。 汽车类的封装,也要换个角度,除了车型信息以外还可以存一些其他归类的信息。主要还是封装技巧。 我这样说,你明白了吗?
隐隐约约,你的意思是car对象还是car,只是他的字段另行封装成其他类型是吧?那我现在有一个“基础组件”的概念,这个组件有id/name/type/ver/creatTime/img/desc的基本属性,我想在前端通过点击“新增零件”按钮,自定义这个基础组件,通过点击“添加属性”按钮完成一个零件规格的定义,然后根据这个规格添加你想要的零件,比如一型,二型螺丝根据这个规格去填充参数,最后持久化到系统形成一个可供用户复用的对象,就像你新增一个员工之后可以在工作流中选择新员工进行审查一样。看了你们的答复我感觉我把大伙都带歪了,我的情况就是更新频繁,除了使用io这种高强度写的方法(我觉得不可能有人这么做吧),能不能使用hashmap存储新增的属性或者还有其他办法?我的想法是把新增属性转换成json存储到sql,一张表存储这个基础组件,另一张存储新增的属性(一对一,属性用json存储起来),然后再一张表存储具体的产品(一对一,以key-value形式存储成json)。
冰思雨 2021-03-26
  • 打赏
  • 举报
回复
Java 是面向对象的编程语言,它的特征就是存在 类 和 对象 的概念。 类就是数据结构的规范,你的数据存储一定要按照 类 声明里面的格式来存放。 项目原有的 类继承 的方式,来存储数据,是一个很直观的办法。 优点是,简单直接,代码的可读性很高,初级选手也容易上手,后期维护没有什么门槛。 缺点也会显而易见,就是新类型的车子过来,就要基于新车型的特点创建对应的实现类。 一般状况下,我们是按照使用场景来处理这种问题的。 如果车型更新不频繁,可以容忍添加一个新车型就必须进行一次版本升级,那就按照原有方案进行开发即可。换句话说,在开发的时候,你就把现在所有能涉及到的车型对应的类,就建立了就好,反正,一年也出不了几个新车型,或者说,一年也更新不了几个程序版本。 如果车型更新频繁,我们会换个角度来搞定这个事情。将车型的属性信息提取出来封装成类,而不是具体的车型封装成类。换句话说就是,以前是一个车型一个类,现在嘛,一个车型一个对象即可。这样的话,车型这个类会比较稳定,基本上没有变动的可能性,然后,一个车型 new 一个对象即可。 汽车的类也要调整,以前是一个车型一个类,new 这个类的对象,就是车的对象,现在嘛,车型是对象,车对象里面包含一个车类型对象的引用即可。 汽车类的封装,也要换个角度,除了车型信息以外还可以存一些其他归类的信息。主要还是封装技巧。 我这样说,你明白了吗?
maradona1984 2021-03-26
  • 打赏
  • 举报
回复
引用 28 楼 JSP_killmylife 的回复:
[quote=引用 26 楼 maradona1984 的回复:][quote=引用 24 楼 JSP_killmylife 的回复:][quote=引用 22 楼 maradona1984 的回复:]感觉你的描述脱离实际需求了,一般来讲,数据库设计成车辆类型 + 车辆属性表就可以了,属性表就做成key/value那种结构就好了
其实这不是什么需求问题哈,主要是我看别人系统有这种东西,很好奇要怎么实现,你看看我21楼的描述吧,那就是这个系统的样子[/quote] 你说的貌似就是我想说的,存json这种肯定不太合理,你的产品应该不会特别多,所以设计一个产品表,存一些共有的属性,然后一个属性表,字段就产品id,key,value,排序什么的,一条属性就是一条记录[/quote] 只所以存json只是为了整张表更直白,毕竟有索引,估计不会很慢。[/quote] 还有模糊搜索向后模糊才能用到索引,全模糊是用不到的...你真觉得能用上索引?我觉得怕是悬,如果根据属性筛选数据,怕是快不了
JSP_killmylife 2021-03-26
  • 打赏
  • 举报
回复
引用 29 楼 maradona1984 的回复:
[quote=引用 28 楼 JSP_killmylife 的回复:][quote=引用 26 楼 maradona1984 的回复:][quote=引用 24 楼 JSP_killmylife 的回复:][quote=引用 22 楼 maradona1984 的回复:]感觉你的描述脱离实际需求了,一般来讲,数据库设计成车辆类型 + 车辆属性表就可以了,属性表就做成key/value那种结构就好了
其实这不是什么需求问题哈,主要是我看别人系统有这种东西,很好奇要怎么实现,你看看我21楼的描述吧,那就是这个系统的样子[/quote] 你说的貌似就是我想说的,存json这种肯定不太合理,你的产品应该不会特别多,所以设计一个产品表,存一些共有的属性,然后一个属性表,字段就产品id,key,value,排序什么的,一条属性就是一条记录[/quote] 只所以存json只是为了整张表更直白,毕竟有索引,估计不会很慢。[/quote] 对大字段做索引,希望以后别后悔[/quote] 他有个ID的啊,json不做索引啊
maradona1984 2021-03-26
  • 打赏
  • 举报
回复
引用 28 楼 JSP_killmylife 的回复:
[quote=引用 26 楼 maradona1984 的回复:][quote=引用 24 楼 JSP_killmylife 的回复:][quote=引用 22 楼 maradona1984 的回复:]感觉你的描述脱离实际需求了,一般来讲,数据库设计成车辆类型 + 车辆属性表就可以了,属性表就做成key/value那种结构就好了
其实这不是什么需求问题哈,主要是我看别人系统有这种东西,很好奇要怎么实现,你看看我21楼的描述吧,那就是这个系统的样子[/quote] 你说的貌似就是我想说的,存json这种肯定不太合理,你的产品应该不会特别多,所以设计一个产品表,存一些共有的属性,然后一个属性表,字段就产品id,key,value,排序什么的,一条属性就是一条记录[/quote] 只所以存json只是为了整张表更直白,毕竟有索引,估计不会很慢。[/quote] 对大字段做索引,希望以后别后悔
JSP_killmylife 2021-03-26
  • 打赏
  • 举报
回复
引用 26 楼 maradona1984 的回复:
[quote=引用 24 楼 JSP_killmylife 的回复:][quote=引用 22 楼 maradona1984 的回复:]感觉你的描述脱离实际需求了,一般来讲,数据库设计成车辆类型 + 车辆属性表就可以了,属性表就做成key/value那种结构就好了
其实这不是什么需求问题哈,主要是我看别人系统有这种东西,很好奇要怎么实现,你看看我21楼的描述吧,那就是这个系统的样子[/quote] 你说的貌似就是我想说的,存json这种肯定不太合理,你的产品应该不会特别多,所以设计一个产品表,存一些共有的属性,然后一个属性表,字段就产品id,key,value,排序什么的,一条属性就是一条记录[/quote] 只所以存json只是为了整张表更直白,毕竟有索引,估计不会很慢。
JSP_killmylife 2021-03-26
  • 打赏
  • 举报
回复
引用 26 楼 maradona1984 的回复:
[quote=引用 24 楼 JSP_killmylife 的回复:][quote=引用 22 楼 maradona1984 的回复:]感觉你的描述脱离实际需求了,一般来讲,数据库设计成车辆类型 + 车辆属性表就可以了,属性表就做成key/value那种结构就好了
其实这不是什么需求问题哈,主要是我看别人系统有这种东西,很好奇要怎么实现,你看看我21楼的描述吧,那就是这个系统的样子[/quote] 你说的貌似就是我想说的,存json这种肯定不太合理,你的产品应该不会特别多,所以设计一个产品表,存一些共有的属性,然后一个属性表,字段就产品id,key,value,排序什么的,一条属性就是一条记录[/quote] 对对对,我差不多就是这个意思,唯一不同的就是我还得定义产品规格,也就是定义一个螺丝在本系统中需要什么属性,用户只需在自己的平台上点击新建螺丝类型,根据后台人员定义的规格填充属性,这样一个新的型号的螺丝就生成了。
maradona1984 2021-03-26
  • 打赏
  • 举报
回复
引用 24 楼 JSP_killmylife 的回复:
[quote=引用 22 楼 maradona1984 的回复:]感觉你的描述脱离实际需求了,一般来讲,数据库设计成车辆类型 + 车辆属性表就可以了,属性表就做成key/value那种结构就好了
其实这不是什么需求问题哈,主要是我看别人系统有这种东西,很好奇要怎么实现,你看看我21楼的描述吧,那就是这个系统的样子[/quote] 你说的貌似就是我想说的,存json这种肯定不太合理,你的产品应该不会特别多,所以设计一个产品表,存一些共有的属性,然后一个属性表,字段就产品id,key,value,排序什么的,一条属性就是一条记录
JSP_killmylife 2021-03-26
  • 打赏
  • 举报
回复
引用 23 楼 老王就是我 的回复:
[quote=引用 19 楼 JSP_killmylife 的回复:][quote=引用 18 楼 JSP_killmylife 的回复:][quote=引用 16 楼 老王就是我 的回复:][quote=引用 15 楼 JSP_killmylife 的回复:][quote=引用 13 楼 老王就是我 的回复:][quote=引用 12 楼 老王就是我 的回复:]如果要实现完全动态,那绝对做不到,至少java做不到。但如果可以预先定义n个车型,预先定义四个车型:A、B、C、D,前端只能选择这四个,那可以试下模板模式或者策略模式
类似这种

class interface Car{
    int type=0;
    void test();
}

class A interface Car{
    int type=1;
    public void test(){
        sout("处理逻辑")
    }
}
class B interface Car{ int type=1; public void test(){ sout("处理逻辑") } } [/code] 使用的话,可以这样

@auto...(自动注入那个东东)
private Car[] cars;

public void test(int type){
    for(Car car:cars){
        if(car.type=type){
            car.test();
        }
    }
}
大概这样,后续维护只需要管car的实现类,如果有添加新的车型就加一个实现[/quote] 大佬,能用hashmap来维护那些新增的属性吗?新增的属性用另一张表来维护。毕竟新增过后除了库存/金额/创/修时间,其他都是静态的。[/quote] 如果有独有的属性,就在A、B、C上面加不就好了吗?如果是共有的,就在car上加,不懂你在问啥[/quote] 因为我在某工业管理软件上面看到他们所有的自定义零组件都是基于系统自带的通用模板ITEM上面拓展的,你只需在前端选择添加属性,选择属性类型就能持久化你自定义的零组件。[/quote] 换句话说,其实不能用汽车产品族来举例我这个问题,应该用汽车零件举例,我的目的是学习像这种系统一样,所有的零件都基于系统自带的始类型创建,比如我的始类型只有id,ver,creat/edit-time,我通过前端添加属性,使之成为螺丝,轮胎,底盘。[/quote] 属性的类型不是问题,问题在于逻辑处理要怎么做?目前已知所有编程语言都只能预设,假设有A、B、C、D、E等等的属性,然后他们组合成什么样,要处理成什么样。因为要进行逻辑处理,所有的属性类型都必须预设,比如说我有螺丝、螺母、螺丝刀、活塞这几个零件做了逻辑处理,那么我就只会开放这几个零件的选择,因为没做处理,所以前端是不允许添加这几个零件以外的属性。 而我举的车的例子,它只是一个例子而已,只是告诉你实现思路,并不是一个成熟的可用的产品。把A、B、C车子换成劳斯莱斯、奔驰、宝马等(原谅我车盲),这三台车子共有的属性很多,有车窗、车盖、车标、方向盘啥的,但也会有一些独有的设计是其他厂商没有的,独有的设计写在A、B、C实现类里,那些共有的属性(车窗、车盖、车标啥的)写在CAR接口上[/quote] 我知道这个思路,但不灵活啊。
JSP_killmylife 2021-03-26
  • 打赏
  • 举报
回复
引用 22 楼 maradona1984 的回复:
感觉你的描述脱离实际需求了,一般来讲,数据库设计成车辆类型 + 车辆属性表就可以了,属性表就做成key/value那种结构就好了
其实这不是什么需求问题哈,主要是我看别人系统有这种东西,很好奇要怎么实现,你看看我21楼的描述吧,那就是这个系统的样子
老王就是我 2021-03-26
  • 打赏
  • 举报
回复
引用 19 楼 JSP_killmylife 的回复:
[quote=引用 18 楼 JSP_killmylife 的回复:][quote=引用 16 楼 老王就是我 的回复:][quote=引用 15 楼 JSP_killmylife 的回复:][quote=引用 13 楼 老王就是我 的回复:][quote=引用 12 楼 老王就是我 的回复:]如果要实现完全动态,那绝对做不到,至少java做不到。但如果可以预先定义n个车型,预先定义四个车型:A、B、C、D,前端只能选择这四个,那可以试下模板模式或者策略模式
类似这种

class interface Car{
    int type=0;
    void test();
}

class A interface Car{
    int type=1;
    public void test(){
        sout("处理逻辑")
    }
}
class B interface Car{ int type=1; public void test(){ sout("处理逻辑") } } [/code] 使用的话,可以这样

@auto...(自动注入那个东东)
private Car[] cars;

public void test(int type){
    for(Car car:cars){
        if(car.type=type){
            car.test();
        }
    }
}
大概这样,后续维护只需要管car的实现类,如果有添加新的车型就加一个实现[/quote] 大佬,能用hashmap来维护那些新增的属性吗?新增的属性用另一张表来维护。毕竟新增过后除了库存/金额/创/修时间,其他都是静态的。[/quote] 如果有独有的属性,就在A、B、C上面加不就好了吗?如果是共有的,就在car上加,不懂你在问啥[/quote] 因为我在某工业管理软件上面看到他们所有的自定义零组件都是基于系统自带的通用模板ITEM上面拓展的,你只需在前端选择添加属性,选择属性类型就能持久化你自定义的零组件。[/quote] 换句话说,其实不能用汽车产品族来举例我这个问题,应该用汽车零件举例,我的目的是学习像这种系统一样,所有的零件都基于系统自带的始类型创建,比如我的始类型只有id,ver,creat/edit-time,我通过前端添加属性,使之成为螺丝,轮胎,底盘。[/quote] 属性的类型不是问题,问题在于逻辑处理要怎么做?目前已知所有编程语言都只能预设,假设有A、B、C、D、E等等的属性,然后他们组合成什么样,要处理成什么样。因为要进行逻辑处理,所有的属性类型都必须预设,比如说我有螺丝、螺母、螺丝刀、活塞这几个零件做了逻辑处理,那么我就只会开放这几个零件的选择,因为没做处理,所以前端是不允许添加这几个零件以外的属性。 而我举的车的例子,它只是一个例子而已,只是告诉你实现思路,并不是一个成熟的可用的产品。把A、B、C车子换成劳斯莱斯、奔驰、宝马等(原谅我车盲),这三台车子共有的属性很多,有车窗、车盖、车标、方向盘啥的,但也会有一些独有的设计是其他厂商没有的,独有的设计写在A、B、C实现类里,那些共有的属性(车窗、车盖、车标啥的)写在CAR接口上
maradona1984 2021-03-26
  • 打赏
  • 举报
回复
感觉你的描述脱离实际需求了,一般来讲,数据库设计成车辆类型 + 车辆属性表就可以了,属性表就做成key/value那种结构就好了
一品梅 2021-03-25
  • 打赏
  • 举报
回复
javascript弱类型可以
老王就是我 2021-03-25
  • 打赏
  • 举报
回复
引用 12 楼 老王就是我 的回复:
如果要实现完全动态,那绝对做不到,至少java做不到。但如果可以预先定义n个车型,预先定义四个车型:A、B、C、D,前端只能选择这四个,那可以试下模板模式或者策略模式
类似这种

class interface Car{
    int type=0;
    void test();
}

class A interface Car{
    int type=1;
    public void test(){
        sout("处理逻辑")
    }
}
class B interface Car{ int type=1; public void test(){ sout("处理逻辑") } } [/code] 使用的话,可以这样

@auto...(自动注入那个东东)
private Car[] cars;

public void test(int type){
    for(Car car:cars){
        if(car.type=type){
            car.test();
        }
    }
}
大概这样,后续维护只需要管car的实现类,如果有添加新的车型就加一个实现
老王就是我 2021-03-25
  • 打赏
  • 举报
回复
如果要实现完全动态,那绝对做不到,至少java做不到。但如果可以预先定义n个车型,预先定义四个车型:A、B、C、D,前端只能选择这四个,那可以试下模板模式或者策略模式
weixin_42066565 2021-03-25
  • 打赏
  • 举报
回复
回帖test
一只三黄鸡 2021-03-25
  • 打赏
  • 举报
回复
引用 9 楼 JSP_killmylife 的回复:
[quote=引用 7 楼 一只三黄鸡 的回复:]想偷懒???每门! ! ! 要不在car里加一个List<Map<string,T>> fileds 但是我还是认为抽象出公共的在 加ICar接口 再继承实现会更好
你说的这个抽象我有点蒙啊,能不能举个例子呢?[/quote] 直接看6楼把,6楼说的没错的,我这个随便写的,其实就是类似一个map了
JSP_killmylife 2021-03-25
  • 打赏
  • 举报
回复
引用 18 楼 JSP_killmylife 的回复:
[quote=引用 16 楼 老王就是我 的回复:][quote=引用 15 楼 JSP_killmylife 的回复:][quote=引用 13 楼 老王就是我 的回复:][quote=引用 12 楼 老王就是我 的回复:]如果要实现完全动态,那绝对做不到,至少java做不到。但如果可以预先定义n个车型,预先定义四个车型:A、B、C、D,前端只能选择这四个,那可以试下模板模式或者策略模式
类似这种

class interface Car{
    int type=0;
    void test();
}

class A interface Car{
    int type=1;
    public void test(){
        sout("处理逻辑")
    }
}
class B interface Car{ int type=1; public void test(){ sout("处理逻辑") } } [/code] 使用的话,可以这样

@auto...(自动注入那个东东)
private Car[] cars;

public void test(int type){
    for(Car car:cars){
        if(car.type=type){
            car.test();
        }
    }
}
大概这样,后续维护只需要管car的实现类,如果有添加新的车型就加一个实现[/quote] 大佬,能用hashmap来维护那些新增的属性吗?新增的属性用另一张表来维护。毕竟新增过后除了库存/金额/创/修时间,其他都是静态的。[/quote] 如果有独有的属性,就在A、B、C上面加不就好了吗?如果是共有的,就在car上加,不懂你在问啥[/quote] 因为我在某工业管理软件上面看到他们所有的自定义零组件都是基于系统自带的通用模板ITEM上面拓展的,你只需在前端选择添加属性,选择属性类型就能持久化你自定义的零组件。[/quote] 换句话说,其实不能用汽车产品族来举例我这个问题,应该用汽车零件举例,我的目的是学习像这种系统一样,所有的零件都基于系统自带的始类型创建,比如我的始类型只有id,ver,creat/edit-time,我通过前端添加属性,使之成为螺丝,轮胎,底盘。
加载更多回复(13)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧