论坛首页 Java企业应用论坛

是谁破坏了枚举类型?

浏览 11914 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (14) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-05-22  
sammor 写道
devworks 写道
enum是声明不变量的,你的 setValue是干什么用的?

    为了不去因为要加一种子类型而去再添加一个字段,而是提供可以改变其值,只不过字段里面设好的是默认值而已。
    卡下面,又分很多种卡类型,这样的子类型。



晕倒,那就不要用枚举了,用个类不就完了!场景使用的问题,枚举类本身及其状态应该是固定(不变的),好比远程调用需要借口,当然你要用类来专递也可以的。但是总会有不同的看法。
0 请登录后投票
   发表时间:2011-05-22  
mercyblitz 写道
你的代码设计有问题,既然用了枚举为什么还有把他的状态value改变!


是的,只是演示这样的枚举出现了可以让人修改value值的,但导致这样的错误。而这种错误是隐性的。

最好的方式就是:

  private final String value; 

这样,setValue()方法,就会自动报错。对value的值更新不了。
0 请登录后投票
   发表时间:2011-05-22  
mercyblitz 写道
sammor 写道
devworks 写道
enum是声明不变量的,你的 setValue是干什么用的?

    为了不去因为要加一种子类型而去再添加一个字段,而是提供可以改变其值,只不过字段里面设好的是默认值而已。
    卡下面,又分很多种卡类型,这样的子类型。



晕倒,那就不要用枚举了,用个类不就完了!场景使用的问题,枚举类本身及其状态应该是固定(不变的),好比远程调用需要借口,当然你要用类来专递也可以的。但是总会有不同的看法。


是的,你说的没错,场景上的问题,但往往一些已经设计好的东西,在不断的需求变更中,需要灵活的变动,而引发的对枚举类的思考。
0 请登录后投票
   发表时间:2011-05-22  
枚举被拿来改值? 有这么用的吗. 拜托别滥用! 你直接用 class 不结了吗
0 请登录后投票
   发表时间:2011-05-22  
liu.anxin 写道
枚举被拿来改值? 有这么用的吗. 拜托别滥用! 你直接用 class 不结了吗


     很多人可能会有疑问,为什么好端端的枚举类,不只加字段而去想方设法破坏它呢。我想说的是,应用的场景各种各样,有时要需求变更过程中,而去想一些解决的方式,当然这个过程中会有很多的问题,但这样的问题,碰到了,解决了,对我而言,对是一种成长。
0 请登录后投票
   发表时间:2011-05-22   最后修改:2011-05-22
liu.anxin 写道
枚举被拿来改值? 有这么用的吗. 拜托别滥用! 你直接用 class 不结了吗


枚举类是本来就在应用中的,只是我的新需求,要求需要支持更多的类型,以后可能还有未知的类型出来。而我又不能经常的去更新这个枚举类(因为在一个引用包中)。所以头脑风暴似的YY的试了一下。
0 请登录后投票
   发表时间: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);
    }
0 请登录后投票
   发表时间: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 ?
0 请登录后投票
   发表时间: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值改变才是呀,但是为什么只有服务端没有被改变值,客户端却被修改掉了呢?

0 请登录后投票
   发表时间: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);
    }




嗯,非常感谢,枚举类在进行传输的时候,传过去的是它的实例名,具体传输过去之后的值,是看接收端的枚举类下的实例名对应的值了。这个源码很好的说明了这个问题的原因。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics