2014-04-16 15 views

Trả lời

5

Chú thích @Immutable này chỉ thị cho trình biên dịch để thực hiện một chuyển đổi AST mà thêm thu khí cần thiết, nhà thầu, bằng, hashCode và khác phương thức trợ giúp thường được viết khi tạo các lớp bất biến với các thuộc tính đã định nghĩa. [1]

Vì vậy, @Immutable tạo chức năng trợ giúp, tương tự như "trường hợp" ở Scala. Từ khóa final chỉ thị trình biên dịch rằng biến cụ thể là không thay đổi, vì nó có nghĩa là trong Java.

Lớp đầu tiên tương đương với lớp thứ hai với một số hàm trợ giúp.

[1] http://groovy.codehaus.org/gapi/groovy/transform/Immutable.html

+1

"Lớp đầu tiên là tương đương với lớp thứ hai với một số chức năng helper" - đây là một cực kỳ mơ hồ mô tả sự khác biệt đáng kể giữa hai khái niệm này –

2

Các @Immutable annoatation làm cho trình biên dịch để biến đổi một lớp như vậy mà nó không thể thay đổi sau khi xây dựng. Công cụ sửa đổi final - khi được áp dụng cho một biến/trường - đảm bảo rằng biến không thể được gán lại sau khi xây dựng. Khi áp dụng cho một lớp học, final ngăn không cho lớp đó được mở rộng.

Khi một lớp được khai báo bất biến, các loại của tất cả các thuộc tính cũng phải bất di bất dịch, hoặc trình biên dịch phải biết làm thế nào để làm cho họ không thay đổi, đó là làm cho Date, Collection, Map, vv Vì vậy, trong ví dụ của bạn ở trên MyOtherClass cũng phải không thay đổi.

Để minh họa sự khác biệt giữa một cánh đồng cuối cùng và một lĩnh vực bất biến

class FinalClass { 
    final List list 
} 

l là cuối cùng, bạn không có thể chuyển nhượng lại sau khi xây dựng như thế này:

def fc = new FinalClass(list: []) 
fc.list = [] // throws a ReadOnlyPropertyException 

Nhưng bạn thể biến đổi trường này, ví dụ:

def fc = new FinalClass(list: []) 
fc.list << new Object() 

Ngược lại, trường không thể thay đổi cũng không được thay đổi. Ví dụ, nếu FinalClass được chú thích với @Immutable nỗ lực sau để biến một lĩnh vực sẽ gây ra một ngoại lệ được ném

def fc = new FinalClass(list: []) 
fc.list << new Object() // throws an UnsupportedOperationException 
Các vấn đề liên quan