2012-03-12 6 views
13

質問と同様です。スカラーはJavaと同じように宣伝していますか?それともScalaにとってより慣用的に進化したのですか?それとも無関係にされていますか?意味ScalaでPOJO/JavaBeanパターンはどのように扱われますか?

POJOとのJavaBeans:

  • 属性がプライベートでパラメータを取りません

    1. コンストラクタ、ゲッターとセッターが公開され
    2. ゲッターとセッターはプロパティを定義し、隠ぺいは

    属性

    また、Scalaには意見があります(申し訳ありませんが、私はこの用語を使用して嫌いです)。古いpublicprivateprotectedこの質問に関連するデザインの属性はありますか?

  • 答えて

    33

    ScalaにもPOJO風のイディオムがありますが、JavaBeansとは異なり、Scalaはさまざまな側面に重点を置いています。

    1. Scalaは異なる命名規則があります:あなたは常にあなたがフィールドに直接アクセスし、その逆にゲッター/セッターから切り替えることにした場合でもobj.fooobj.foo = barを書くことができます

      def foo: Foo  //Foo getFoo() in Java 
      def foo_=(foo: Foo) //void setFoo(Foo foo) in Java 
      

      この道を。これは、ユニフォームアクセスの原則と呼ばれています。ためのJavaの相互運用性へ

    2. は、@BeanProperty注釈が導入されました:

      @BeanProperty var foo: Foo = _ 
      

      コードだけではなく、上記のように、すべてのJavaフレームワークがシームレスに動作だけでなくスカラ座のようなゲッター/セッターを作成しますが、Javaのよう。

    3. あなたは

    4. を不変オブジェクトを使用してはるかに頻繁に自分自身を見つけるように、Scalaは私が実際に行われたコンストラクタで不変オブジェクトと初期化を好む、変数(var)と値(val)間で決定することができ強制Scalaでは非常に簡単:

      class Foo(val age: Int, val name: String) 
      

      または偶数(デフォルトでvalcaseのクラス):

      case class Foo(age: Int, name: String) 
      

      このコードは、わかりやすく鮮やかです。

      public class Foo(var age: Int, var name: String) { 
      
          def this() { 
           this(0, "") 
          } 
      
      } 
      

      valvarに置き換えられて:あなたはJavaフレームワークと協力する必要がある場合は、あなたはまだ-にargUコンストラクタとセッターを必要としません。Scalaでは

    5. アクセス修飾子は、Javaに比べて若干良好なデフォルトを持っている:

      class Foo(var a: Int, x: Int) { 
      
          var b: Int = _ 
      
          private var c: Int = _ 
      
          private[this] var d: Int = _ 
      
          def twisted = a + b + c + d + x 
      
      } 
      

      変数abpublicゲッター/セッターとprivateフィールドとなります(フィールドは、デフォルトでプライベートで、方法が公開されています)。 cdもプライベート変数です。しかし、private[this]を追加すると、dはプライベートゲッター/セッターではなくクラス内で直接アクセスできます。

      xはコンストラクタの横のどこかで使用されるため、Scalaは自動的にそのためのプライベートフィールドも作成します。ただし、ゲッタ/セッタは生成されません。twistedメソッド(dと同じ)で直接アクセスされます。

    更新:コメントでは、ゲッター/セッターの名前を変更するように頼んでいます。ここでさらに複雑な例があります。ゲッター/セッターは、同時に2つのフィールドに基づいて値を計算している。

    class Foo { 
    
        private[this] var first: Char = _ 
        private[this] var rest: String = _ 
    
        def fake = first + rest 
    
        def fake_=(s: String) { 
         first = s.head 
         rest = s.tail 
        } 
    
    } 
    

    は、内部の複雑に見えますが、外部からそれは古き良きプロパティのようになります。それがあったかのように

    val foo = new Foo() 
    foo.fake = "ABC" 
    println(foo.fake) 
    

    class Foo(var fake: String) 
    
    +4

    あなたは8分ですべてを書きましたか?それは素晴らしい! :D – aitchnyu

    +0

    'aProperty'をしたいが、それは' aString:String'属性に基づいていますか? – aitchnyu

    +0

    @aitchnyu:私は編集を続けます;-)。また、私はScala-Java統合で多くの作業をしています。 –

    関連する問題