Scala魔术使私人/受保护成员可见



我正在使用一个API,其中特征是这样的:

package pkg
trait Trait { 
  private[pkg] def f = ...
  private[pkg] val content = ...
}

我想使用 Jar 文件中的 API 访问代码中的变量content和函数f(因此我无法修改原始代码以删除private定义)。

能够想出的第一个解决方案是在同一包中创建一个新的类,这有助于我访问私有/受保护的成员函数,如下所示:

package pkg
trait PkgBridge {
  def f = Trait.f
  def getContent(t : Trait) = t.content;
}

这样,我就可以从我的代码调用包私有成员。

我想知道对于这种情况是否有任何复杂的方法或常见的模式(比如一些带有隐含的魔法或其他东西?

谢谢!

你正在做的事情可能和任何方法一样好,并且不鼓励。

如果某些东西是包私有的,那么它可能是一个实现细节,没有很好地指定接口,以冒着将任何人暴露给它的风险允许它完全私有。 所以要小心! 可能有充分的理由不这样做。

除了反射之外,在 Scala 中获取包私有内容的唯一方法是在该包中,因此您的方法是一个合适的方法。

请注意,此替代方法也可能有用:

package pkg {
  trait TraitBridge extends Trait {
    def fBridge = f
    def contentBridge = content
  }
}

然后你可以

class MyClass extends TraitBridge { ... }

以专门选取要访问的扩展程序(在备用名称下)。

最新更新