具有提供类型/值别名的特征的Scala包对象

vir*_*yes 6 scala object package type-alias

在Scala中对对象进行别名的"正确"方法是什么?

例如,假设我需要在我的应用程序的各个部分中使用RoleGroup(它被分解为SBT子项目)

trait RoleGroup
object RoleGroup {
  case object ADMIN     extends RoleGroup
  case object MEMBER    extends RoleGroup
  case object PUBLIC    extends RoleGroup
}
Run Code Online (Sandbox Code Playgroud)

由于我不想重复导入RoleGroup,我决定将RoleGroup特征和对象别名化为类型和val对应物,如下所示:

package com.developer
package controller

trait ControllerBase {
  type RoleGroup    = controller.RoleGroup
  val RoleGroup     = controller.RoleGroup
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后子项目包对象可以扩展帮助器特征以获得免费导入:

package com.client

package object member
  extends com.developer.controller.ControllerBase
Run Code Online (Sandbox Code Playgroud)

我正在为需要在范围内的其他案例对象做同样的事情.这是一个明智的解决方案吗?即我需要注意哪些缺点/问题?所有编译和浏览器测试页面似乎都像预重构应用程序一样运行,但我不确定这是否是最好的方法.

Nik*_*kov 6

这是一种明智的做法.事实上,它正在Scala库本身中应用.

您只需要两个可想象的成员级别别名:类型(即特征和类)和值(即对象,包和值).你把它们都盖住了.