代码之家  ›  专栏  ›  技术社区  ›  jhegedus

Scala:private[packageName]类A(vals:Int)中的奇怪行为隐藏了类型A,但是s仍然可以从另一个包访问,为什么?

  •  0
  • jhegedus  · 技术社区  · 6 年前

    考虑这个代码:

    package Example1 {
    
      package thePackage {
    
        // PRIVATE test class with PUBLIC field
        private[thePackage] class VisibilityTest(value: String, val valueVisible: Int ) 
    
        // WRAPPER
        class Wrapper {
          val visibilityTest = new VisibilityTest( "Value set by Wrapper object.", 43 )
        }
    
      }
    
      object Tester extends App {
        val wrapper = new thePackage.Wrapper()
    
    //    val wrapped: thePackage.VisibilityTest = wrapper.visibilityTest; // compile ERROR
    
        val wrapped = wrapper.visibilityTest; // COMPILES FINE -> ????????
    
    //    println(wrapped.value) // ERROR -> as it should be, since value's getter is private
        println( wrapped.valueVisible ) // no ERROR -> ?????????
    
      }
    
    }
    

    我有两个问题,怎么可能:

    • println( wrapped.valueVisible ) val wrapped: thePackage.VisibilityTest = wrapper.visibilityTest;
    • val wrapped = wrapper.visibilityTest 编译得很好但是 val wrapped: thePackage.VisibilityTest = ...
    1 回复  |  直到 6 年前
        1
  •  6
  •   Tim    6 年前

    您已标记 VisibilityTest 作为私人内部 thePackage thePackage.VisibilityTest 外部 包装 . 这就是为什么 不要编译。

    但是,可以放置 private public 同学们,这就是 Wrapper

    这不是编写此类代码的标准方法。这个 私有的 类通常会扩展非私有 trait 它定义了外部行为。使用这个模型,公共类中的值将被赋予非私有特征的类型,这样私有信息就不会泄露出去。

    还要注意的是 value 不是成员,它只是构造函数的参数,因此它没有getter(为了混淆问题,当前编译器将把这个值放在对象中并提供getter,但这不是语言规范的一部分)