Tôi đã từng nghĩ điều đó private val
và private final val
cũ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 = e
vớ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 val
không phải private final val
.
Tại sao scalac không được coi private val
là private final val
? Có lý do cơ bản nào không?
private
sửa đổi phạm vi có ngữ nghĩa giống như package private
trong Java. Bạn có thể muốn nói private[this]
.
private
có 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 , private
khô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ầnfinal
từ khóa trong Scala? Tại sao trình biên dịch không thể xử lý tất cả cácval
s theo cùng một cách vớifinal val
s?