加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何从Scala公共API屏蔽实现级别类,特征和对象?

发布时间:2020-12-16 10:00:14 所属栏目:安全 来源:网络整理
导读:我想减少实现级细节泄露到我的 Scala公共API中,并且有很多可用于调整可见性的旋钮,我的头脑正在试图弄清楚: What is the best way to shield implementation level classes,traits and objects from Scala public APIs ? 我能想到的最好的事情就是做到这一
我想减少实现级细节泄露到我的 Scala公共API中,并且有很多可用于调整可见性的旋钮,我的头脑正在试图弄清楚:

What is the best way to shield implementation level classes,traits
and objects from Scala public APIs ?

我能想到的最好的事情就是做到这一点:

package restaurant {
  trait Service {
    acceptOrder(dish: String,quantity: Int)
  }

  package impl {
    private class ServiceImpl {   // mark this & everything else in package as private
      acceptOrder(dish: String,quantity: Int) = println("order accepted")
    }

    private class ServiceHelper { // mark this & everything else in package as private
      def helpDoStuff() = ???
    }
  }
}

但请注意,我必须使用’private’标记impl包中的所有内容,
随着包装中的东西数量的增加,这变得非常繁琐(并且容易忘记).如果Scala可以选择声明一个>那就太好了.包<是私有的,或者至少将包中所有内容的默认可见性设置为该包的私有.但这似乎并不存在. 我确信这样做有最好的练习模式…如果你知道一个,请告诉我. 更新:我在Programming Scala书中读到了有关包对象的内容.这似乎是在一个公共API中集中所有内容的好方法.但是包对象似乎没有提供一种方便的方法来隐藏不在包对象中的所有对象的可见性.

IDEA用户的附注:
我的嵌套方法的一个问题是它似乎搞乱了IDEA中的自动缩进.对我来说,一个单独的问题是找到解决方法.我向Intellij提交了一个错误(如果你们中有人正面临这个问题,并希望对其进行投票:https://youtrack.jetbrains.com/issue/IDEA-144872)

解决方法

好问题!

那么使用私有对象呢?当然,只有你能做到这一点才有用
在单个文件中实施您的服务.否则我认为impl命名空间方法是你能做的最好的.

package restaurant

sealed trait Service {
  def acceptOrder(dish: String,quantity: Int): Unit
}

object Service {
  def create: Service = new Impl.ServiceImpl()

  private object Impl {
    class ServiceImpl extends Service {
      def acceptOrder(dish: String,quantity: Int) = println("order accepted")
    }

    class ServiceHelper {
      def helpDoStuff() = ???
    }
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读