Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 定义一个具有私有成员的类的最佳方法,这些成员可以很容易地在一行中实例化?_Scala_Groovy - Fatal编程技术网

Scala 定义一个具有私有成员的类的最佳方法,这些成员可以很容易地在一行中实例化?

Scala 定义一个具有私有成员的类的最佳方法,这些成员可以很容易地在一行中实例化?,scala,groovy,Scala,Groovy,假设我有以下scala类(需要改进以解决这个问题 在这个问题中,可能不是有效的scala类): 在groovy中,我可以用单步执行此操作,如: def hotel = new Hotel(name: "some Hotel", stars: 5, address: new Address(street: "342 main", city: "edmond", postCode: "12345")) Scala是否有类似的功能,以及如何改进上面所示的类声明以改进设计。注意,我必须有来自另一个Ja

假设我有以下scala类(需要改进以解决这个问题 在这个问题中,可能不是有效的scala类):

在groovy中,我可以用单步执行此操作,如:

def hotel = new Hotel(name: "some Hotel", stars: 5, address: new Address(street: "342 main", city: "edmond", postCode: "12345"))

Scala是否有类似的功能,以及如何改进上面所示的类声明以改进设计。注意,我必须有来自另一个Java库的注释。此外,一旦类被实例化或以其他方式从数据库中获取,我必须能够修改单个字段(可变)。

地址可以定义为:

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() = {...}
}
编辑:固定@Embedded

如果没有,您可能需要采取以下措施:

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

...
}

注意,如果对象上的变量不可修改,则可以在类定义上使用val而不是var。这样,类似address.street的内容将返回street的当前值,但address.street=“new street address”将不会编译。

地址可以定义为:

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() = {...}
}
编辑:固定@Embedded

如果没有,您可能需要采取以下措施:

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

...
}

注意,如果对象上的变量不可修改,则可以在类定义上使用val而不是var。这样,address.street之类的内容将返回street的当前值,但address.street=“new street address”将不会编译。

谢谢,这非常有用。我试试看。你们能告诉我,若我像你们提到的那个样声明类,那个么这些变量在默认情况下被认为是私有的,因为我并没有看到private关键字吗?我甚至不知道private是否能确保scala代码中的封装(因为我们仍在直接修改字段),就像客户端只能通过Java类中的公共getter和setter访问或修改变量一样。如果您真的不需要更改它们,那么案例类及其
copy
方法非常好:
val newAddress=theAddress.copy(postcode=“b2b2b2”)
。在Scala中,默认访问是公共的。如果您希望一个字段在构造时可以设置,但之后不可读,那么您应该将类地址(private-val-street:String)放入其中。如果您还没有,我会郑重建议您直接在Scala中获取Scala第二版()@amc Nothing访问字段中的编程。所有的访问都是通过getter和setter方法进行的——您只是没有注意到它,因为您从未看到字段本身。谢谢,这非常有帮助。我试试看。你们能告诉我,若我像你们提到的那个样声明类,那个么这些变量在默认情况下被认为是私有的,因为我并没有看到private关键字吗?我甚至不知道private是否能确保scala代码中的封装(因为我们仍在直接修改字段),就像客户端只能通过Java类中的公共getter和setter访问或修改变量一样。如果您真的不需要更改它们,那么案例类及其
copy
方法非常好:
val newAddress=theAddress.copy(postcode=“b2b2b2”)
。在Scala中,默认访问是公共的。如果您希望一个字段在构造时可以设置,但之后不可读,那么您应该将类地址(private-val-street:String)放入其中。如果您还没有,我会郑重建议您直接在Scala中获取Scala第二版()@amc Nothing访问字段中的编程。所有访问都是通过getter和setter方法进行的——您只是没有注意到它,因为您从来没有看到字段本身。