使用私有构造函数向类添加方法?

时间:2013-01-23 04:22:56

标签: scala

有一个类(特别是TypedPipe[T] in com.twitter.scalding)只有一个私有构造函数,我希望为它添加一些方法。它看起来像这样

class TypedPipe[+T] private ( a : Int) { 

}

这通常通过定义隐式转换方法来完成。但是,我需要访问a来定义我想要的方法。这在Scala中根本不可能吗?

2 个答案:

答案 0 :(得分:3)

如果我正确地解释了你的问题,答案是肯定的,这在Scala中根本不可能。 这与私有构造函数没有任何关系。如果它是公开的,你会遇到完全相同的问题。

class TypedPipe[+T] private ( a : Int) { 

}

这里的要点是val之前没有varaa不是TypedType的属性,而只是其构造函数的参数,即没有创建属性来保存对象内部的值

这相当于Java代码:

public class MyClass{
    private final String value;
    public MyClass(int a){
        System.out.println("I was initialized with " + a);
        this.value="b";
    }
}

你可以用REPL轻松检查出来。如果您希望a可以在构造函数外部访问,则它必须是varval

class TypedPipe[+T] private ( a : Int) {
  println(a)
}

class TypedPipe1[+T] private (val a : Int) {
  println(a)
}

我是REPL中javap反汇编程序的忠实粉丝:

scala> :javap -p TypedPipe

scala> Compiled from "TypedType.scala"
public class TypedPipe extends java.lang.Object implements scala.ScalaObject{
    private TypedPipe(int);
}


scala> :javap -p TypedPipe1

scala> Compiled from "TypedType.scala"
public class TypedPipe1 extends java.lang.Object implements scala.ScalaObject{
    private final int a;
    public int a();
    private TypedPipe1(int);
}

正如您所看到的,在第一个版本中,没有成员属性可以保存a的值,并且没有getter

答案 1 :(得分:2)

只有TypedPipe的随播广告可以调用其构造函数。期。据推测,有一个工厂(在所述伴侣中)你可以用来创建实例(否则有什么用呢?)。从那里你可以......这些天被接受的术语是什么? “延伸?” “提高?”或者,正如我们的老前辈所说,“皮条客”那种类型。