2011-07-28 20 views
9

Từ REPL:Thêm loại rõ ràng để val ngăn val từ được sử dụng như một hằng số trong chú thích

scala> final val x = "x" 
x: java.lang.String("x") = x 

scala> @javax.persistence.Table(name = x) case class foo() 
defined class foo 

scala> final val x:java.lang.String = "x" 
x: java.lang.String = x 

scala> @javax.persistence.Table(name = x) case class foo() 
<console>:6: error: annotation argument needs to be a constant; found: x 
     @javax.persistence.Table(name = x) case class foo() 

Ai đó có thể giải thích tại sao chỉ này hoạt động mà không có một loại?

+0

Tại sao bạn sử dụng từ khóa 'final'? – paradigmatic

+0

cuối cùng là cần thiết để tạo hằng số theo nghĩa đen mà Daniel đề cập bên dưới. Nếu không có nó, bạn sẽ nhận được cùng một lỗi được đề cập ở trên. – scalapeno

Trả lời

8

Không có loại, final val hoạt động như hằng số theo nghĩa đen - số nhận dạng được thay thế bằng giá trị của nó tại thời gian biên dịch. Với loại, nó trở thành một tham chiếu đến một cái gì đó được lưu trữ ở đâu đó, mà không thể được sử dụng trên các chú thích.

này được xác định trên phần 4.1 của đặc tả:

Một định nghĩa giá trị không đổi có dạng

final val x = e 

trong đó e là một biểu thức hằng số (§6.24). Công cụ sửa đổi cuối cùng phải là hiện tại và không thể cung cấp chú thích loại nào. Các tham chiếu đến giá trị hằng số x được coi là các biểu thức hằng số; trong mã được tạo, chúng được thay thế bằng cạnh bên phải của định nghĩa bên e.

Đây là cách duy nhất bạn có thể nhận được các hằng số có tên đúng trong Scala. Họ có lợi ích hiệu suất, họ thực sự được đảm bảo không biến đổi (ngay cả một final val với một loại có thể được thay đổi thông qua sự phản ánh) và, tất nhiên, chúng có thể được sử dụng trong chú thích.

+0

Tôi đoán đó là những gì đã xảy ra, nhưng tại sao nó lại hoạt động như thế? Có một số lợi ích để thực hiện nó theo cách đó không? Có trường hợp nào đây là một tính năng hữu ích không? – scalapeno

+0

@ tritium6 Tôi mở rộng câu trả lời của mình, nhưng không được sử dụng trong chú thích một trường hợp đủ hữu ích? –

+0

Cảm ơn bạn đã mở rộng. Bạn nói đúng, trường hợp chú thích hữu ích. Ý tôi là, có một trường hợp hữu ích cho biểu thức đã gõ hay không - tại sao bạn muốn có một trường hợp mà val cuối cùng là một tham chiếu? – scalapeno

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