Tôi đã từng nghĩ điều đó private valvà private final valcũng giống như vậy, cho đến khi tôi xem phần 4.1 trong Scala Reference:
Định nghĩa giá trị không đổi có dạng
final val x = evới 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 có mặt và không có chú thích loại nào có thể được cung cấp. Các tham chiếu đến giá trị hằng số x được coi là biểu thức hằng số; trong mã được tạo, chúng được thay thế bằng phía bên phải của định nghĩa e.
Và tôi đã viết một bài kiểm tra:
class PrivateVal {
private val privateVal = 0
def testPrivateVal = privateVal
private final val privateFinalVal = 1
def testPrivateFinalVal = privateFinalVal
}
javap -c đầu ra:
Compiled from "PrivateVal.scala"
public class PrivateVal {
public int testPrivateVal();
Code:
0: aload_0
1: invokespecial #19 // Method privateVal:()I
4: ireturn
public int testPrivateFinalVal();
Code:
0: iconst_1
1: ireturn
public PrivateVal();
Code:
0: aload_0
1: invokespecial #24 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_0
6: putfield #14 // Field privateVal:I
9: return
}
Mã byte đúng như Scala Reference đã nói: private valkhông phải private final val.
Tại sao scalac không được coi private vallà private final val? Có lý do cơ bản nào không?
privatesửa đổi phạm vi có ngữ nghĩa giống như package privatetrong Java. Bạn có thể muốn nói private[this].
privatecó nghĩa là nó chỉ hiển thị với các cá thể của lớp này, private[this]chỉ cá thể này - ngoại trừ các trường hợp của cùng một lớp , privatekhông cho phép bất kỳ ai (bao gồm từ cùng một gói) truy cập giá trị.
valđã là bất biến, tại sao chúng ta lại cầnfinaltừ khóa trong Scala? Tại sao trình biên dịch không thể xử lý tất cả cácvals theo cùng một cách vớifinal vals?