6

Scala では、以下のようなオブジェクト プライベート変数とメソッドの名前の衝突が許容されることが経験的に発見されました。

class Test {
  private[this] var x = 1
  def x(): String = this.x.toString
}

このコードは、少なくとも Scala 2.10 では有効であり、期待どおりの結果が得られます (Java に逆コンパイルされます)。

public class Test {
    private int x;

    public String x() {
        return BoxesRunTime.boxToInteger(x).toString();
    }

    public Test() {
        x = 1;
    }
}

問題は、この動作が設計によるものであるという信頼できる証拠を仕様で見つけることができなかったため、後の Scala リリースでこの動作を信頼できるかどうかわからないことです。それで、誰か私にそのような知識の源を提案できますか?

更新: 私の目標は、このアプローチを使用して、Hibernate データ モデルを Scala クラスにマップすることです。Hibernate が Scala コレクションをサポートできるようにする簡単な方法はないため、Java コレクションをプライベート フィールドにマップし、それを名前付きのアクセサー メソッドで Scala コレクションにラップしたいと考えました。重要な要件は、フィールドとメソッドを同じ名前で保持することです。これは、Hibernate コレクションの論理名も保持する必要があるためです (たとえば、HQL で参照するため)。

4

1 に答える 1

3

これらの衝突は完全に正常です。ただし、これらの衝突は (必要な場合) getter/setter に対してのみ表示されるため、コードを読むことが問題になる可能性があることに注意してください。それ以外の場合は、次のような明確なメソッド名を使用してください。

def xAsString():

このスレッドは、名前の衝突に関するscalaの議論にも役立ちます

Daniel Spewaks によるこの命名規則

于 2013-06-21T10:29:13.417 に答える