锁定老帖子 主题:是谁破坏了枚举类型?
精华帖 (1) :: 良好帖 (0) :: 新手帖 (14) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-22
sammor 写道 devworks 写道 enum是声明不变量的,你的 setValue是干什么用的?
为了不去因为要加一种子类型而去再添加一个字段,而是提供可以改变其值,只不过字段里面设好的是默认值而已。 卡下面,又分很多种卡类型,这样的子类型。 晕倒,那就不要用枚举了,用个类不就完了!场景使用的问题,枚举类本身及其状态应该是固定(不变的),好比远程调用需要借口,当然你要用类来专递也可以的。但是总会有不同的看法。 |
|
返回顶楼 | |
发表时间:2011-05-22
mercyblitz 写道 你的代码设计有问题,既然用了枚举为什么还有把他的状态value改变!
是的,只是演示这样的枚举出现了可以让人修改value值的,但导致这样的错误。而这种错误是隐性的。 最好的方式就是: private final String value; 这样,setValue()方法,就会自动报错。对value的值更新不了。 |
|
返回顶楼 | |
发表时间:2011-05-22
mercyblitz 写道 sammor 写道 devworks 写道 enum是声明不变量的,你的 setValue是干什么用的?
为了不去因为要加一种子类型而去再添加一个字段,而是提供可以改变其值,只不过字段里面设好的是默认值而已。 卡下面,又分很多种卡类型,这样的子类型。 晕倒,那就不要用枚举了,用个类不就完了!场景使用的问题,枚举类本身及其状态应该是固定(不变的),好比远程调用需要借口,当然你要用类来专递也可以的。但是总会有不同的看法。 是的,你说的没错,场景上的问题,但往往一些已经设计好的东西,在不断的需求变更中,需要灵活的变动,而引发的对枚举类的思考。 |
|
返回顶楼 | |
发表时间:2011-05-22
枚举被拿来改值? 有这么用的吗. 拜托别滥用! 你直接用 class 不结了吗
|
|
返回顶楼 | |
发表时间:2011-05-22
liu.anxin 写道 枚举被拿来改值? 有这么用的吗. 拜托别滥用! 你直接用 class 不结了吗
很多人可能会有疑问,为什么好端端的枚举类,不只加字段而去想方设法破坏它呢。我想说的是,应用的场景各种各样,有时要需求变更过程中,而去想一些解决的方式,当然这个过程中会有很多的问题,但这样的问题,碰到了,解决了,对我而言,对是一种成长。 |
|
返回顶楼 | |
发表时间:2011-05-22
最后修改:2011-05-22
liu.anxin 写道 枚举被拿来改值? 有这么用的吗. 拜托别滥用! 你直接用 class 不结了吗
枚举类是本来就在应用中的,只是我的新需求,要求需要支持更多的类型,以后可能还有未知的类型出来。而我又不能经常的去更新这个枚举类(因为在一个引用包中)。所以头脑风暴似的YY的试了一下。 |
|
返回顶楼 | |
发表时间:2011-05-22
sammor 写道 qianhd 写道 你这标题应该改成 是谁设计了这种垃圾代码
哈哈,是我故意这么做的,不是为了设计,只是一个实验。 那直接告诉你 这条路走不通的 在ObjectOutputStream中,所有Enum都使用下面这个方法write, private void writeEnum(Enum en, ObjectStreamClass desc, boolean unshared) throws IOException { bout.writeByte(TC_ENUM); ObjectStreamClass sdesc = desc.getSuperDesc(); writeClassDesc((sdesc.forClass() == Enum.class) ? desc : sdesc, false); handles.assign(unshared ? null : en); writeString(en.name(), false); } |
|
返回顶楼 | |
发表时间:2011-05-22
sammor 写道 liu.anxin 写道 枚举被拿来改值? 有这么用的吗. 拜托别滥用! 你直接用 class 不结了吗
枚举类是本来就在应用中的,只是我的新需求,要求需要支持更多的类型,以后可能还有未知的类型出来。而我又不能经常的去更新这个枚举类(因为在一个引用包中)。所以头脑风暴似的YY的试了一下。 如果是这样, 我建议你建议一个类型表, 把控制的权力交给用户和应用, 而不是应用程序. 枚举在编译时会自动将字段加上 static final 修饰. GoodsType 编译后会就这样: public final class GoodsType extends java.lang.Enum{ public static final GoodsType Card; public static final GoodsType Gift; public static final GoodsType Prize; ... } 告诉我, 你想怎么 setter ? |
|
返回顶楼 | |
发表时间:2011-05-22
liu.anxin 写道 sammor 写道 liu.anxin 写道 枚举被拿来改值? 有这么用的吗. 拜托别滥用! 你直接用 class 不结了吗
枚举类是本来就在应用中的,只是我的新需求,要求需要支持更多的类型,以后可能还有未知的类型出来。而我又不能经常的去更新这个枚举类(因为在一个引用包中)。所以头脑风暴似的YY的试了一下。 如果是这样, 我建议你建议一个类型表, 把控制的权力交给用户和应用, 而不是应用程序. 枚举在编译时会自动将字段加上 static final 修饰. GoodsType 编译后会就这样: public final class GoodsType extends java.lang.Enum{ public static final GoodsType Card; public static final GoodsType Gift; public static final GoodsType Prize; ... } 告诉我, 你想怎么 setter ? 嗯,你的建议很不错, 1、只是为了这样一个需求而去建一张专门的表,好像有点儿大材小用了。 2、编译会确实会转为static final这样的修饰进去,只是如果这样的话,加的setValue()方法里面就不应该可以把value值改变才是呀,但是为什么只有服务端没有被改变值,客户端却被修改掉了呢? |
|
返回顶楼 | |
发表时间:2011-05-22
qianhd 写道 sammor 写道 qianhd 写道 你这标题应该改成 是谁设计了这种垃圾代码 哈哈,是我故意这么做的,不是为了设计,只是一个实验。 那直接告诉你 这条路走不通的 在ObjectOutputStream中,所有Enum都使用下面这个方法write, private void writeEnum(Enum en, ObjectStreamClass desc, boolean unshared) throws IOException { bout.writeByte(TC_ENUM); ObjectStreamClass sdesc = desc.getSuperDesc(); writeClassDesc((sdesc.forClass() == Enum.class) ? desc : sdesc, false); handles.assign(unshared ? null : en); writeString(en.name(), false); } 嗯,非常感谢,枚举类在进行传输的时候,传过去的是它的实例名,具体传输过去之后的值,是看接收端的枚举类下的实例名对应的值了。这个源码很好的说明了这个问题的原因。 |
|
返回顶楼 | |