作者dream1124 (全新开始)
看板java
标题Re: [问题] 如何让enum成为另一个enum的建构参数?
时间Tue Oct 11 08:54:49 2011
※ 引述《dream1124 (全新开始)》之铭言:
这问题我後来找到解决方式了
我原先是希望能把 E1, E2 当成一个在程式码即宣告写死的集合以便检查....
E1 E2 有共同的元素, 但也有不同的元素, E1 是 E2 的子集,
而集合的元素型态都是某个介面宣告的元素, 从enum取出来以後要当成
数值固定的 Entity 使用, 没有想要扩充 E1 E2 元素功能的意思
所以我让 E1, E2 都实作相同的界面, 再由 E1 E2 的建构式塞入往後要透过介面
取出来的常数值....
然後我还希望 E3 这个 enum 可以当成另外一个集合,
集合内的元素分别含有 E1, E2 这两个集合, 并可以透过统一的方法
从不同的 E3 元素中取出整个集合
试了很久之後, 我找出 E3 的写法, 在此分享解决方式给大家:
public enum E3 {
Practice( E1.values() ),
Competition( E2.values() );
private Collection<Interface> interfaceCollection;
private GameMode(Interface[] collection){
this.interfaceCollection = new HashSet<Interface>();
for ( Interface element : collection ){
interfaceCollection.add(element);
}
}
public Collection<Interface> getInterfaceCollection(){
return interfaceCollection;
}
}
方法就是把 E1, E2 分别呼叫 values() 转成 E1[] 和 E2[]
但因为 E1 和 E2 的有实作 Interface, 所以 E1[] 和 E2[] 自然也是 Interface[]
之後再把他们分别在建构式中注入给 Collection<Interface>
就可以让 E3 的元素各自拥有一个 Interface 物件的集合了
只可惜使用 E3 的时候就无法运用 enum 的长处....
以上一些心得整理, 希望对大家有帮助
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.228.35.68
1F:推 LaPass:( ̄□ ̄|||)a 好特别 10/11 12:42
2F:→ adrianshum:我是完全搞不懂为什麽要这样写....? 10/11 15:21
就是我想要在程式开始前先宣告几个不会增加元素的集合,
不同集合内的元素实作相同介面, 但是不会扩充功能, 不是 is-a relation ship
每个元素有几个固定栏位但是取出来的都是定值, 於是我宣告了 E1 E2
简单说就是我把 enum 当成集合来用
至於 E3 是因为想要让程式可以在迭代 E3 的元素出来以後, 利用固定的方法
取得每个 E3 元素封装的集合
但一开始因为 E1, E2 是不同的型态又不能继承任何类别, 搞得有点不知怎麽下手
後来把 E1 E2 转成统一的资料结构(阵列)就解决了
3F:推 AI3767:你所指, E3可惜无法运用的enum长处是? 10/11 16:29
enum 可以当成方法的参数与回传值, 让程式好懂好检查啊
还可以当成 switch case 的判定参数啊~
E3 回传值变成其他资料结构的话, 就只是一般资料结构而已 Orz
※ 编辑: dream1124 来自: 61.228.42.199 (10/11 21:14)
4F:→ sbrhsieh:还是看不出来为甚麽需要 E3(GameMode) 存在? 10/11 21:36
5F:→ sbrhsieh:是不是E1/E2的实际名称就应是Practice/Competition? 10/11 21:39
我还原最初的需求, 不要用 E1 E2 E3 代表好了,
E3 enum 的型态是 GameMode , GameMode 物件的实例封装一些与 GameMode 相关的
物件, 这些物件也有自己的栏位, 只不过都是常数
GameMode 其中一个栏位封装游戏角色的集合, 游戏角色的型态是 GameRole
游戏角色的集合只会因为 GameMode 的不同而有大有小, 没有其他需求
GameRole 只是用来封装一些常数的
我只是希望能在程式撰写的时候利用 enum 的特性让程式更好懂更好写
程式会从 GameMode 的项目中取出 GameRole 的集合, 然後根据这个集合的大小
还有是否具有特定的 GameRole 而有一些不一样的处理
当然也是可以写一个负责生产 Collection<GameRole> 的物件, 在程式开始之後去
读一份设定档上面的值, 然後塞进 GameRole 的实例, 再把那些 GameRole 塞进
某个 Collection, 最後透过某个 Factory method 回传给其他需要这些参数的
程式元件, 但是我觉得太麻烦而且 GameRole 集合的需求也很死不会变
所以才想利用 enum 简单在一个类别档中宣告不同 GameMode 所拥有的 GameRole 集合
※ 编辑: dream1124 来自: 61.228.36.217 (10/12 08:01)
6F:→ adrianshum:我觉得你这种误用 enum 的做法反而让程式难懂了 10/12 11:25
7F:推 AI3767:还是不懂, "E3 回传值变成其他资料结构" 意思是? 10/12 16:28
那请问一般都是怎麽做的呢?
不同游戏模式下有不同种类的角色,每种角色的栏位数量相同,且这些栏位值是常数
如果是这样的需求版众们会怎麽设计呢?
※ 编辑: dream1124 来自: 140.136.155.111 (10/12 22:12)