2011-06-27 6 views
1

私は(この質問に懸念 に対処するために改善する必要があり、有効な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ライブラリからのアノテーションを持っている必要があることに注意してください。また、クラスがインスタンス化されたり、データベースから取得されたりすると、個々のフィールドを変更できる必要があります(変更可能)。

答えて

4

アドレスは、次のように定義することができます。

class Address(var street:String, var city: String, var postCodet: String) 

これは、変数は後で変更可能になりたいを前提としています。

あなたはよりホテルがあるため、注釈を必要とするために、もう少し面白いです

new Address(street="street", city="city", postCodet="a1a1a1") 

とアドレスを作成することができます。私は、これはあなたのためのトリックを行いますと思う:

class Hotel(var name:String, var stars:Int, @Embedded var address: Address) extends Model { 
     def someMethod() = {...} 
} 

EDIT:固定@Embedded

れていない場合は、あなたが何かに頼るする必要がある場合があります

class Hotel(var name:String, var stars:Int, address_in: Address) extends Model { 
@Embedded 
var address:Address = address_in 

... 
} 

注意、オブジェクト上の変数が変更可能でない場合、クラス定義ではなくvarをvalとすることができます。この方法では、address.streetのようなものがstreetの現在の値を返しますが、address.street = "new street address"はコンパイルされません。

+0

ありがとうthats非常に便利です。私はそれを試みます。私がプライベートキーワードを見なかったので、あなたが言及したようなクラスがデフォルトでプライベートとみなされると宣言しているかどうかを知ることができますか?クライアントがJavaクラスのpublic getterおよびsetterを介してのみ変数にアクセスしたり変更したりできるように、プライベートではスカラコードでカプセル化が確実に行われるかどうかはわかりません(フィールドを直接変更しているためです)。 – ace

+0

フィールドを変更する必要があることの一つ。 _really_それらを変更する必要がない場合、大文字と小文字のクラスとその 'copy'メソッドは素晴らしいです:' val newAddress = theAddress.copy(postcode = "b2b2b2") '。 – pr1001

+0

Scalaでは、デフォルトのアクセスはpublicです。フィールドを構築時に設定できるようにしたいが、それ以降は読み込みできないようにするには、クラスAddress(private val street:String)を配置します。まだお持ちでない場合は、Scalaの第2版(http://www.artima.com/shop/programming_in_scala_2ed)を取得することを真剣にお勧めします。 – Mikezx6r

関連する問題