Tôi không thể hiểu được quan điểm của Option[T]
đẳng cấp trong Scala. Ý tôi là, tôi không thể nhìn thấy bất kỳ khuyến khích nào None
kết thúc null
.
Ví dụ, hãy xem xét mã:
object Main{
class Person(name: String, var age: int){
def display = println(name+" "+age)
}
def getPerson1: Person = {
// returns a Person instance or null
}
def getPerson2: Option[Person] = {
// returns either Some[Person] or None
}
def main(argv: Array[String]): Unit = {
val p = getPerson1
if (p!=null) p.display
getPerson2 match{
case Some(person) => person.display
case None => /* Do nothing */
}
}
}
Bây giờ, giả sử, phương thức getPerson1
trả về null
, sau đó lời gọi được thực hiện display
trên dòng đầu tiên của main
bị ràng buộc không thành công với NPE
. Tương tự nếu getPerson2
trả về None
, display
cuộc gọi sẽ lại thất bại với một số lỗi tương tự.
Nếu vậy, tại sao Scala lại làm phức tạp mọi thứ bằng cách giới thiệu một trình bao bọc giá trị mới ( Option[T]
) thay vì làm theo một cách tiếp cận đơn giản được sử dụng trong Java?
CẬP NHẬT:
Tôi đã chỉnh sửa mã của mình theo đề xuất của @Mitch . Tôi vẫn không thể nhìn thấy bất kỳ lợi thế cụ thể của Option[T]
. Tôi phải kiểm tra sự đặc biệt null
hoặc None
trong cả hai trường hợp. :(
Nếu tôi đã hiểu đúng từ câu trả lời của @ Michael , thì có phải lợi thế duy nhất của Option[T]
nó là nó nói rõ ràng với lập trình viên rằng phương thức này có thể trả về Không ? Đây có phải là lý do duy nhất đằng sau sự lựa chọn thiết kế này?