ScalaにもPOJO風のイディオムがありますが、JavaBeansとは異なり、Scalaはさまざまな側面に重点を置いています。
Scalaは異なる命名規則があります:あなたは常にあなたがフィールドに直接アクセスし、その逆にゲッター/セッターから切り替えることにした場合でもobj.foo
とobj.foo = bar
を書くことができます
def foo: Foo //Foo getFoo() in Java
def foo_=(foo: Foo) //void setFoo(Foo foo) in Java
この道を。これは、ユニフォームアクセスの原則と呼ばれています。ためのJavaの相互運用性へ
は、@BeanProperty
注釈が導入されました:
@BeanProperty var foo: Foo = _
コードだけではなく、上記のように、すべてのJavaフレームワークがシームレスに動作だけでなくスカラ座のようなゲッター/セッターを作成しますが、Javaのよう。
あなたは
を不変オブジェクトを使用してはるかに頻繁に自分自身を見つけるように、Scalaは私が実際に行われたコンストラクタで不変オブジェクトと初期化を好む、変数(var
)と値(val
)間で決定することができ強制Scalaでは非常に簡単:
class Foo(val age: Int, val name: String)
または偶数(デフォルトでval
case
のクラス):
case class Foo(age: Int, name: String)
このコードは、わかりやすく鮮やかです。
public class Foo(var age: Int, var name: String) {
def this() {
this(0, "")
}
}
注val
var
に置き換えられて:あなたはJavaフレームワークと協力する必要がある場合は、あなたはまだ-にargUコンストラクタとセッターを必要としません。Scalaでは
アクセス修飾子は、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
}
変数a
とb
をpublic
ゲッター/セッターとprivate
フィールドとなります(フィールドは、デフォルトでプライベートで、方法が公開されています)。 c
とd
もプライベート変数です。しかし、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)
あなたは8分ですべてを書きましたか?それは素晴らしい! :D – aitchnyu
'aProperty'をしたいが、それは' aString:String'属性に基づいていますか? – aitchnyu
@aitchnyu:私は編集を続けます;-)。また、私はScala-Java統合で多くの作業をしています。 –