2010-10-05 48 views
8

Tôi hiện đang đánh giá Scala cho các dự án trong tương lai và bắt gặp một thứ gì đó kỳ lạ. Tôi đã tạo hằng số sau cho chúng tôi trong một JSP:Sử dụng hằng số Scala trong Java

val FORMATED_TIME = "formatedTime"; 

Và nó không hoạt động. Sau khi một số thử nghiệm tôi quyết định dịch ngược để đến đáy của nó:

private final java.lang.String FORMATED_TIME; 

public java.lang.String FORMATED_TIME(); 
    Code: 
    0: aload_0 
    1: getfield #25; //Field FORMATED_TIME:Ljava/lang/String; 
    4: areturn 

Điều đó thật thú vị! Cá nhân tôi đã tự hỏi khá lâu tại sao một thanh tra cần tiền tố nhận được và một trình tắt số tiền tố đặt bằng Java khi chúng sống trong các không gian tên khác nhau.

Tuy nhiên, có thể vẫn còn khó xử để giải thích cho phần còn lại của nhóm. Vì vậy, nó có thể có một hằng số công cộng mà không có thanh tra?

Trả lời

11

Điều này là do các Uniform Access Principle, ví dụ: Phương pháp và Fields không thể phân biệt

Xem this answer

Trong Scala 2.8.0 này có nghĩa là nếu bạn có một đối tượng đồng, bạn sẽ mất bạn tĩnh giao nhận)

Nếu bạn có điều này trong Scala:

//Scala 
object CommonControler { 
     val FORMATED_TIME = "formatedTime"; 
} 

Bạn có thể sử dụng nó như thế này từ Java

//Java 

// Variables become methods 
CommonControler$.MODULE$.FORMATED_TIME(); 
// A static forwarder is avaliable 
CommonControler.FORMATED_TIME(); 

Cũng xem cuốn sách Scala in Depth

Cũng lưu ý các @scala.reflect.BeanProperty cho các lớp học.

+0

Tôi phải kiểm tra lại điều đó - bởi vì tôi đang thiếu giao nhận.Tôi đã có một người giao nhận trong lớp 2 mà tôi đã tạo ra. – Martin

+1

Tôi nghĩ rằng tôi đã tìm ra. Nếu bạn có một lớp CommonControler và và đối tượng CommonControler thì bạn không nhận được các giao nhận tĩnh :-(. – Martin

1

Tôi đã xem xét kỹ hơn về mã được giải mã và ghi chú điều gì đó khác. Các biến không thực sự tĩnh. Vì vậy, ý tưởng tiếp theo của tôi là sử dụng một đối tượng thay vì:

object KommenControler 
{ 
    val FORMATED_TIME = "formatedTime"; 
} // KommenControler 

Nhưng bây giờ mọi thứ biến thực sự xấu xí:

public final class ….KommenControler$ extends java.lang.Object implements scala.ScalaObject{ 

public static final ….KommenControler$ MODULE$; 

private final java.lang.String FORMATED_TIME; 

public static {}; 
    Code: 
    0: new #9; //class …/KommenControler$ 
    3: invokespecial #12; //Method "<init>":()V 
    6: return 

public java.lang.String FORMATED_TIME(); 
    Code: 
    0: aload_0 
    1: getfield #26; //Field FORMATED_TIME:Ljava/lang/String; 
    4: areturn 

Vì vậy, tôi nhận được một lớp học thêm kết thúc vào $ trong đó có một trường hợp singleton gọi MOUDLE $. Và vẫn còn thanh tra viên. Vì vậy, việc tiếp cận với các biến bên trong một jsp trở thành:

final String formatedTime = (String) request.getAttribute (….KommenControler$.MODULE$.FORMATED_TIME()); 

này hoạt động như mong đợi và cá nhân tôi có thể sống với nó, nhưng làm sao tôi có giải thích rằng cho nhóm?

Tất nhiên nếu có cách đơn giản hơn tôi muốn nghe về nó.

+1

Bạn nên bọc nó trong một đối tượng java đẹp để trừu tượng cuộc gọi xấu xí nhưng cần thiết. Trong thực tế, trong Java, bạn nên luôn luôn đóng gói các hằng số tĩnh công khai cuối cùng trong cuộc gọi phương thức để tránh chúng được biên dịch tại biên dịch. – paradigmatic

+0

Xem câu trả lời này: http://stackoverflow.com/questions/3282653/how-do-you-call-a-scala-singleton-method-from-java/3445597#3445597 – oluies

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