0

プライベートコンストラクターしかないクラス(具体的にはcom.twitter.scaldingのTypedPipe [T])があり、それにいくつかのメソッドを追加したいと思います。こんな感じ

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

}

これは通常、暗黙の変換メソッドを定義することによって行われます。ただし、必要なメソッドを定義するには、にアクセスする必要があります。これはScalaでは単純に不可能ですか?

4

2 に答える 2

3

私があなたの質問を正しく解釈した場合、答えはイエスです。これはScalaでは不可能です。これは、プライベートコンストラクターとは何の関係もありません。それが公開されていれば、まったく同じ問題が発生します。

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

}

ここでのポイントは、がないか、valまたはvar前にあるということですaaはのプロパティではなく、コンストラクタへの引数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コンストラクターの外部からアクセスできるようにする場合は、aまたは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、ゲッターもありません。

于 2013-01-23T08:27:37.930 に答える
2

TypedPipeのコンパニオンのみがそのコンストラクターを呼び出すことができます。限目。おそらく、インスタンスを作成するために使用できるファクトリ(前述のコンパニオン内)があります(それ以外の場合、それは何が良いですか?)。そこからあなたは...最近受け入れられている用語は何ですか?"拡張する?" "強化する?" または、私たち昔の人が言うように、そのタイプの「ポン引き」。

于 2013-01-23T04:31:47.343 に答える