2012-03-12 23 views
13

Giống như câu hỏi. Scala có quảng bá giống như Java không? Hay nó đã được phát triển để trở nên thành ngữ hơn với Scala? Hoặc nó đã được thực hiện không liên quan?Mẫu POJO/JavaBean được xử lý như thế nào trong Scala?

POJO và JavaBeans nghĩa:

  1. Constructor mà mất không có thông số
  2. thuộc tính này là tư nhân, getter và setter là công khai
  3. getter và setter xác định tài sản, che giấu các thuộc tính

Ngoài ra, Scala có ý kiến ​​(xin lỗi, tôi không thích sử dụng thuật ngữ này) khi sử dụng cũ public, private, protected thiết kế thuộc tính có liên quan đến câu hỏi này?

Trả lời

33

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.

  1. 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.fooobj.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 .

  2. 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.

  3. 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

  4. 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.

  5. 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 ab 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). cd 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.

    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) 
+4

Và bạn đã viết tất cả trong 8 phút? Thật tuyệt vời! : D – aitchnyu

+0

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

+0

@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. –

Các vấn đề liên quan