Scala:使用Trait+Companion对象枚举实现

Scala:使用Trait+Companion对象枚举实现,scala,Scala,我的问题是:这是一个反模式: 我有一个密封的scala特性,有十几个或两个实现——比如: 包com.erik.logic 封闭特征失效原因{ 为什么:字符串 } 案例对象A扩展了失败原因{ 瓦尔:为什么 } 案例类Bwhy:字符串扩展FailureReason // ... 案例对象Z扩展故障原因{ val为什么=idk } 导入可能会变得丑陋或超过6,根据我读过的大多数样式指南,开始使用.u样式 一种选择是将它们全部放在trait的一个同伴对象中,然后我可以以类似于枚举的方式导入和引用该对象。

我的问题是:这是一个反模式:

我有一个密封的scala特性,有十几个或两个实现——比如:

包com.erik.logic 封闭特征失效原因{ 为什么:字符串 } 案例对象A扩展了失败原因{ 瓦尔:为什么 } 案例类Bwhy:字符串扩展FailureReason // ... 案例对象Z扩展故障原因{ val为什么=idk } 导入可能会变得丑陋或超过6,根据我读过的大多数样式指南,开始使用.u样式

一种选择是将它们全部放在trait的一个同伴对象中,然后我可以以类似于枚举的方式导入和引用该对象。这是反模式吗

包com.erik.logic 特质失败原因{ 为什么:字符串 } 对象失败原因 案例对象A扩展失败原因{…} 案例类Bwhy:字符串扩展FailureReason // ... } //otherFile.scala 导入com.erik.logic.FailureReason ... 原因匹配{ case FailureReason.A=>something 案例失败原因.By=>othery 案例失败原因.C=>etc } //yetAnotherFile.scala 导入com.erik.logic.FailureReason.{A,B,J,Q} // ... 糟糕的比赛{ case SomethingBad=>ReasonWrapperA case somethingthreard=>ReasonWrapperBterrible case SomethingMeh=>ReasonWrapperQ }
这不是反模式,很好。顺便说一句,您可以在包级别以相同的方式导入:import com.erik.logic.{A,B,J,Q},因此不需要出于这个原因将它们放在对象中,但是如果您想这样做,它也没有什么问题


注意,你可能应该把你的特质密封起来。这样,如果您忘记了某个case子句,那么您可以利用编译器警告您,并且您的匹配不是详尽无遗的。

这不是反模式,很好。顺便说一句,您可以在包级别以相同的方式导入:import com.erik.logic.{A,B,J,Q},因此不需要出于这个原因将它们放在对象中,但是如果您想这样做,它也没有什么问题


注意,你可能应该把你的特质密封起来。这样,如果您忘记了某个case子句,那么您可以利用编译器警告您,并且您的匹配不是详尽无遗的。

我不认为这是反模式,我已经使用过几次了。我还看到它在其他项目中使用,如。然而,有,但它与java序列化有关,如果您不需要,这应该不是一个问题无论如何,这可能会以观点为基础。关于序列化的观点并不完全正确。它说不要在另一个类/对象中声明case类,但这解释了如何不在包含大量其他数据的对象中声明case类,这不是一回事。@Dima只是出于好奇,问题还是一样的,对吗?如果在对象内定义了案例类,那么如果需要序列化此类案例类,则必须序列化该对象,从而也序列化所有案例类的定义我很感兴趣,因为一所大学告诉我,在几天前的一次审查中,我在另一个对象中的一个对象中定义了几个case类,只是为了避免创建几个文件夹,所以我想知道这是否真的是一个问题,无论如何,我们并不真正关心java序列化。@LuisMiguelMejíaSuárez序列化并不序列化定义。只有数据。@Dima OK,因此它只能序列化对父对象的引用,这还不错。谢谢。我不认为这是一个反模式,我已经用过几次了。我还看到它在其他项目中使用,如。然而,有,但它与java序列化有关,如果您不需要,这应该不是一个问题无论如何,这可能会以观点为基础。关于序列化的观点并不完全正确。它说不要在另一个类/对象中声明case类,但这解释了如何不在包含大量其他数据的对象中声明case类,这不是一回事。@Dima只是出于好奇,问题还是一样的,对吗?如果在对象内定义了案例类,那么如果需要序列化此类案例类,则必须序列化该对象,从而也序列化所有案例类的定义我很感兴趣,因为一所大学告诉我,在几天前的一次审查中,我在另一个对象中的一个对象中定义了几个case类,只是为了避免创建几个文件夹,所以我想知道这是否真的是一个问题,无论如何,我们并不真正关心java序列化。@LuisMiguelMejíaSuárez序列化并不序列化定义。只有数据。@Dima OK,因此它只能序列化对父对象的引用,这还不错。谢谢。嗨,我只是好奇,真的有必要扩展这种特质吗?换言之,如果它没有像中那样扩展特性,有什么好处
Spark源代码?谢谢。@jack扩展该特性的原因是为了让您可以在其他地方引用它。如果您有一个密封的trait Foo,以及一系列扩展它的实现,然后您创建了一个类似def foobar:Foo的函数,那么您可以确保可以传入的bar始终是这些类型之一。谢谢。我只是想了解,在这里,所有的case对象都不是在扩展主消息,那么拥有这些主消息有什么意义呢?是的,我不知道。我不认为拥有它有任何意义。嗨,只是好奇,真的有必要扩展这种特质吗?换句话说,如果它没有像Spark源代码那样扩展特性,有什么好处?谢谢。@jack扩展该特性的原因是为了让您可以在其他地方引用它。如果您有一个密封的trait Foo,以及一系列扩展它的实现,然后您创建了一个类似def foobar:Foo的函数,那么您可以确保可以传入的bar始终是这些类型之一。谢谢。我只是想了解,在这里,所有的case对象都不是在扩展主消息,那么拥有这些主消息有什么意义呢?是的,我不知道。我认为没有任何意义。