2009-10-05 56 views
12

Thông báo: Do Scala 2.11, NotNull không còn được dùng nữa. Theo như tôi hiểu, nếu bạn muốn một loại tham chiếu không thể vô hiệu hóa, bạn phải trộn các đặc điểm ma thuật NotNull và trình biên dịch sẽ tự động ngăn bạn đặt các giá trị có thể là null trong đó. Xem ví dụ này mailing-list thread.Hỗ trợ thư viện cho đặc điểm NotNull của Scala

Điều còn thiếu là thư viện phong nha hỗ trợ các loại không thể vô hiệu. Nếu tôi muốn viết một gói không cần phải trực tiếp mã java và tôi muốn ngăn tất cả các loại trong gói này sử dụng null theo mặc định, tôi không có lựa chọn nào khác ngoài định nghĩa lại tất cả các biến được tạo như vậy

//can't actually do that, but just to give the general idea 
class NString extends String with NotNull 
class NMap[X,Y] extends Map[X,Y] with NotNull 
... 

tôi hy vọng scala có (như là một plugin trình biên dịch, hoặc thư viện) lựa chọn cho tôi để viết

import collections.notnull._ 

để dễ dàng không cho phép null sử dụng trong một file scala cụ thể.

Có tùy chọn nào để dễ dàng buộc nhiều loại hữu ích trong thư viện chuẩn không bị vô hiệu không?

+1

Bạn có thể mở rộng chuỗi? Tôi nghĩ rằng nó đã được đánh dấu cuối cùng. –

+0

Thực ra bạn không thể. Điểm tốt. Cần phải xác định NString với chuyển đổi ẩn thành chuỗi tôi đoán. –

+1

Tôi đoán bạn tìm kiếm một cái gì đó như 'org.jetbrains.annotations.NotNull' - và tôi cũng nhớ điều đó. – Martin

Trả lời

9

Tôi thực sự không biết thỏa thuận là gì với NotNull, nhưng tôi có ấn tượng rằng Scala chưa hoàn toàn tìm ra cách thức nó muốn xử lý các khái niệm NotNull/Nullable. Chính sách của riêng tôi là không bao giờ sử dụng null trong Scala, và nếu bạn gọi một API Java có thể trả lại null, ngay lập tức chuyển đổi nó thành một Option.

phương pháp

Tiện ích này là bạn thân nhất của tôi:

def ?[A <: AnyRef](nullable: A): Option[A] = if (nullable eq null) None else Some(nullable) 

Sau đó, bạn làm công cụ như thế này:

val foo: Option[Foo] = ?(getFooFromJavaAPIThatMightReturnNull()) 

Tôi tìm thấy điều này đến nay đơn giản hơn cố gắng để theo dõi những gì có thể hoặc không thể được null.

Vì vậy, tôi không trả lời câu hỏi của bạn ở tất cả, nhưng tôi chuyển thông tin này về trong trường hợp nó rất hữu ích ...

Cập nhật: nhiều phiên bản gần đây Scala bây giờ hỗ trợ này trong API tiêu chuẩn:

val foo: Option[Foo] = Option(getFooFromJavaAPIThatMightReturnNull()) 
+1

Vấn đề với cách tiếp cận của bạn là hệ thống kiểu không buộc tôi không sử dụng null. Vì vậy, tôi có thể quên một cuộc gọi Java API, và có một null lén vào mã của tôi mà không nhận thấy. Nếu OTOH tất cả các loại là NotNullable, trình biên dịch sẽ hét lên nếu bạn đã thực hiện val x: String với NotNullable = javaapithatmightreturnNull(). –

+5

'Option.apply' thực hiện các chức năng giống như hàm'? 'Của bạn. – schmmd

+2

Thật vậy, nhưng điều này đã được viết trước khi Option.apply tồn tại. – Lachlan

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