Scala cũng có thành ngữ giống như POJO nhưng chúng khác với JavaBeans và Scala chú trọng vào các khía cạnh khác nhau.
Scala có quy ước đặt tên khác nhau:
def foo: Foo //Foo getFoo() in Java
def foo_=(foo: Foo) //void setFoo(Foo foo) in Java
Bằng cách này bạn luôn có thể viết obj.foo
và obj.foo = bar
ngay cả khi bạn quyết định chuyển từ getters/setters tiếp cận lĩnh vực trực tiếp và ngược lại. Điều này được gọi là nguyên tắc truy cập thống nhất .
Do Java khả năng tương tác, @BeanProperty
chú thích đã được giới thiệu:
@BeanProperty var foo: Foo = _
mã trên không chỉ tạo ra Scala-như getters/setters, nhưng Java như là tốt, vì vậy tất cả các khuôn khổ Java làm việc liên tục.
Scala buộc bạn phải quyết định giữa các biến (var
) và giá trị (val
), do đó bạn thấy mình nhiều thường xuyên hơn sử dụng đối tượng bất biến
Tôi thực sự thích đối tượng bất biến và khởi tạo trong xây dựng, trong đó đã được thực hiện rất dễ dàng trong Scala:
class Foo(val age: Int, val name: String)
hoặc thậm chí (val
theo mặc định trong case
lớp):
case class Foo(age: Int, name: String)
Đoạn mã này rất tuyệt vời trong sự đơn giản của nó. Tuy nhiên, nếu bạn cần phải hợp tác với các khuôn khổ Java, bạn vẫn cần không argu constructor và setters:
public class Foo(var age: Int, var name: String) {
def this() {
this(0, "")
}
}
Note val
được thay thế bằng var
.
bổ Access trong Scala có giá trị mặc định tốt hơn một chút so với 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
}
Biến a
và b
sẽ trở thành private
lĩnh vực với public
getters/setters (trường đang tin theo mặc định, các phương pháp là công khai). c
và d
cũng là các biến riêng tư. Nhưng thêm private[this]
làm cho d
có thể truy cập trực tiếp nội bộ trong lớp chứ không phải bằng trình gỡ rối/thiết lập riêng.
Vì x
được sử dụng ở đâu đó bên cạnh hàm tạo, Scala cũng tự động tạo trường riêng tư cho nó. Tuy nhiên không có getters/setters được tạo ra, nó được truy cập trực tiếp trong phương thức twisted
(giống như d
).
CẬP NHẬT: Trong nhận xét bạn đang hỏi về đổi tên getters/setters. Đây là ví dụ phức tạp hơn. Getters/setters đang tính toán giá trị dựa trên hai lĩnh vực cùng một lúc:
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
}
}
Trông phức tạp bên trong, nhưng từ bên ngoài có vẻ như sở hữu cũ tốt:
val foo = new Foo()
foo.fake = "ABC"
println(foo.fake)
Cũng giống như nếu nó là :
class Foo(var fake: String)
Nguồn
2012-03-12 19:15:39
Và bạn đã viết tất cả trong 8 phút? Thật tuyệt vời! : D – aitchnyu
Whats mã khi bạn muốn 'aProperty' nhưng nó được dựa trên một thuộc tính' aString: String'? – aitchnyu
@aitchnyu: Tôi tiếp tục chỉnh sửa ;-). Ngoài ra tôi làm việc rất nhiều với Scala-Java tích hợp. –