是否有关于何时使用案例类(或案例对象)与在Scala中扩展Enumeration的最佳实践指南?
他们似乎提供了一些相同的好处.
在Java中,我有类似的东西
public enum FlatFileHeaderMapping {
HEADER_EL(1),
HEADER_RESERVED1(5),
HEADER_RESERVED2(2),
HEADER_MESSAGE_TYPE(4)
public final int fieldSize;
private FlatFileHeaderMapping(int fieldSize) {
this.fieldSize = fieldSize;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我可以使用它将每一行放入地图,然后通过此枚举访问地图中的键(如符号)
就我所见,枚举没有这种质量,并且case类没有像枚举声明那样排序 - 因此不能用于匹配记录布局,如上所示.至少在没有有序集合的支持下.
我可能会遗漏一些明显的东西,因此这个问题!
谢谢
射线
我已经看过关于模拟Javaenum和案例类与Enumeration的Scala问题,但似乎太多的努力,太少的好处.
基本上我想有一个values方法返回所有单例对象DayOfWeek而不重复自己几次.
这就是我的代码应该是这样的:
object DayOfWeek extends MyEnum {
object MONDAY extends DayOfWeek(1)
object TUESDAY extends DayOfWeek(2)
object WEDNESDAY extends DayOfWeek(3)
object THURSDAY extends DayOfWeek(4)
object FRIDAY extends DayOfWeek(5)
object SATURDAY extends DayOfWeek(6)
object SUNDAY extends DayOfWeek(7)
}
class DayOfWeek(ordinal: Int)
Run Code Online (Sandbox Code Playgroud)
该方法values应返回类似如下所示的内容:
val values = Array(MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
FRIDAY, SATURDAY, SUNDAY)
Run Code Online (Sandbox Code Playgroud)
一切都应该在MyEnum特质中发生,所以我只需要扩展它来获得功能.
trait MyEnum {
val values = this.getClass.getField("MODULE$") etc. etc.
}
Run Code Online (Sandbox Code Playgroud)
有什么建议可以做到这一点吗?这个想法是values访问类并找到它们正在扩展的类的所有单例对象. …
object WeekDay extends Enumeration {
type WeekDay = Value
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
Run Code Online (Sandbox Code Playgroud)
你会如何设置一个初始值,WeekDay.Mon == 1和WeekDay.Tue == 2等会是真的吗?
在Enumeration中有一个构造函数Enumeration(initial: Int, names: String*),有没有办法可以用它来创建WeekDay对象?
我已经读过这个和这个,但我仍然不理解在Scala中这样做的(惯用的)等效方法
enum Status {
OK(1, "Ok", "Okay"),
NOT_OK(5, "Not Ok", "Not Okay")
BAD(10, "Bad", "Run for your life")
int code;
String name;
String description; // custom fields
Status(int code, String name, String description) {
this.code = code;
this.name = name;
this.description = description;
}
}
class Main {
public static void main(String[] args) {
for(Status status : Status.values) { // iterate through them
doStuff(status);
}
}
private doStuff(Status status) {
System.out.println(status.description);
// and more
}
}
Run Code Online (Sandbox Code Playgroud)