私は(この質問に懸念 に対処するために改善する必要があり、有効なScalaのクラスではないかもしれない)、次のScalaのクラスがあるとします。Groovyで1行で簡単にインスタンス化できるプライベートメンバーを持つクラスを定義する最も良い方法は?
@Entity
class Hotel extends Model {
private var name: String = _;
private var stars: Int = _;
@Embedded
private var address: Address = _;
def someMethod() = {
// do something
}
}
class Address {
private var street: String = _;
private var city: String = _;
private var postCodet: String = _;
}
私は、単一のようにこれを行うことができます:
def hotel = new Hotel(name: "some Hotel", stars: 5, address: new Address(street: "342 main", city: "edmond", postCode: "12345"))
Scalaにはこのようなことがありますが、上に示したクラス宣言を改善してデザインを改善するにはどうすればよいですか?他のJavaライブラリからのアノテーションを持っている必要があることに注意してください。また、クラスがインスタンス化されたり、データベースから取得されたりすると、個々のフィールドを変更できる必要があります(変更可能)。
ありがとうthats非常に便利です。私はそれを試みます。私がプライベートキーワードを見なかったので、あなたが言及したようなクラスがデフォルトでプライベートとみなされると宣言しているかどうかを知ることができますか?クライアントがJavaクラスのpublic getterおよびsetterを介してのみ変数にアクセスしたり変更したりできるように、プライベートではスカラコードでカプセル化が確実に行われるかどうかはわかりません(フィールドを直接変更しているためです)。 – ace
フィールドを変更する必要があることの一つ。 _really_それらを変更する必要がない場合、大文字と小文字のクラスとその 'copy'メソッドは素晴らしいです:' val newAddress = theAddress.copy(postcode = "b2b2b2") '。 – pr1001
Scalaでは、デフォルトのアクセスはpublicです。フィールドを構築時に設定できるようにしたいが、それ以降は読み込みできないようにするには、クラスAddress(private val street:String)を配置します。まだお持ちでない場合は、Scalaの第2版(http://www.artima.com/shop/programming_in_scala_2ed)を取得することを真剣にお勧めします。 – Mikezx6r