2016-09-20 13 views
9

Tôi không thể tìm thấy tài liệu rõ ràng ở bất cứ nơi nào nếu getters và setters thực sự được yêu cầu cho các trường trong Mô hình Realm. Ví dụ, tài liệu tại https://realm.io/docs/java/latest/api/io/realm/RealmObject.html nóiMô hình Realm có thực sự yêu cầu getters và setters không?

Hạn chế duy nhất một RealmObject có là lĩnh vực không được phép có tính chung thẩm, thoáng' hoặc dễ bay hơi. Bất kỳ phương thức nào cũng như trường công khai đều được phép. Khi cung cấp các hàm tạo tùy chỉnh, một hàm tạo công khai không có đối số nào phải được khai báo và để trống.

Các trường được chú thích bằng Bỏ qua không có những hạn chế này và không yêu cầu trình khởi động hoặc thiết lập.

Có vẻ như gợi ý rằng nó là bắt buộc với getters và setters cho các trường không bị bỏ qua. Tuy nhiên, tài liệu tại số https://realm.io/docs/java/latest/#customizing-objects cho biết

Có thể sử dụng RealmObject gần giống như POJO. Mở rộng từ RealmObject, bạn có thể cho phép các trường được công khai và sử dụng các bài tập đơn giản thay vì các bộ định cư và getter.

và sau đó hiển thị mã cho mô hình Realm không có bất kỳ getters and setters nào và thay vào đó có trường công khai, chúng tôi nên sử dụng. Có thật không? Tôi nghĩ Realm thậm chí không lưu trữ bất kỳ giá trị nào trong các lĩnh vực thực tế, vì vậy việc đọc và viết từ chúng có lẽ là một ý tưởng tồi? Ý tôi là tài liệu gỡ lỗi của họ https://realm.io/docs/java/latest/#debugging là:

Thật không may những giá trị này sai vì giá trị của trường không được sử dụng . Realm tạo một đối tượng proxy đằng sau hậu trường và ghi đè các getters và setters để truy cập dữ liệu được lưu giữ trong Realm

Vì vậy, ai đó có thể vui lòng khai sáng cho tôi? Tôi có thể bỏ qua getters và setters và chỉ cần gắn bó với các lĩnh vực công cộng? Có tài liệu kỹ lưỡng nào về điều này không?

Trả lời

4

public trường hoạt động trong hầu hết các trường hợp và vì Realm 2.0.0 chúng hoạt động ngay cả trong các nhà xây dựng của RealmObjects (cho phép "giá trị mặc định") và hoạt động nếu bạn truy cập trực tiếp thuộc tính.

Ví dụ,

SomeObject obj = results.get(i); 
obj.blah = "Blahblah"; 

đó làm việc, bởi vì truy cập lĩnh vực quản lý RealmObjects' được biến đổi bởi các Realm-Transformer vào cuộc gọi getter/setter proxy (trong trường hợp này, vào phương pháp realmSet$blah).

Trường hợp này xảy ra từ 0.88.0, khi Realm bắt đầu được cung cấp dưới dạng plugin Gradle.

Tuy nhiên, giới hạn lớnproxy field access doesn't run in instrumentation tests, because the androidTestCompile scope does not run the transformer.

+0

Cá nhân tôi sử dụng getters/setters. – EpicPandaForce

+1

OK, vì vậy nếu tôi hiểu chính xác: Truy cập trường hoạt động tốt, ngoại trừ bên trong một hàm tạo RealmObject và trong bất kỳ mã nào trong 'androidTest /'. Vì vậy, nếu tôi có thể sống với điều đó, tôi có thể bỏ qua getters và setters? –

+0

Yup!bạn thấy nó đúng (mặc dù như tôi đã nói, tôi thích setters/getters bởi vì họ có vẻ ổn định hơn với tôi) – EpicPandaForce

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