Java thực sự là một cách giải quyết cho vấn đề mà không phải tất cả biểu thức trả về giá trị, vì vậy bạn không thể viết này trong Java:
final String whatever = if (someCondition) {
"final value"
} else {
"other value"
}
Càng ngày, xu hướng trong Java là sử dụng các nhà điều hành ternary thay vào đó:
final String whatever = someCondition ? "final value" : "other value"
Điều này là tốt cho trường hợp sử dụng hạn chế đó, nhưng hoàn toàn không thể chịu được khi bạn bắt đầu xử lý các câu lệnh chuyển đổi và nhiều nhà xây dựng.
Cách tiếp cận của Scala khác nhau ở đây. Tất cả việc xây dựng đối tượng cuối cùng phải đi qua một hàm khởi tạo "chính", tất cả các biểu thức trả về một giá trị (ngay cả khi nó là Unit
, tương đương với Java Void
), và việc xây dựng tiêm được ưu tiên mạnh. Điều này dẫn đến biểu đồ đối tượng được xây dựng một cách rõ ràng dưới dạng Đồ thị theo chu kỳ được chỉ định và cũng hoạt động rất độc đáo với các đối tượng bất biến. Bạn cũng cần lưu ý rằng việc khai báo và xác định các biến trong các hoạt động riêng biệt, nói chung là một thực hành không tốt khi xử lý nhiều luồng - và có thể khiến bạn dễ bị lộ rỗng và điều kiện chủng tộc khi bạn mong đợi chúng (mặc dù ít nhất là). điều này không thực sự là một vấn đề trong quá trình xây dựng đối tượng). Việc tạo ra nguyên tử các giá trị bất biến chỉ là một khía cạnh của cách thức mà các ngôn ngữ chức năng giúp giải quyết đồng thời.
Điều này cũng có nghĩa là trình biên dịch Scala có thể tránh được một số phân tích lưu lượng phức tạp từ đặc tả ngôn ngữ Java.
Như đã trình bày ở trên, Scala Way ™ là:
val whatever =
if (someCondition)
"final value"
else
"other value"
Một cách tiếp cận mà cũng có quy mô lên đến cấu trúc điều khiển khác:
val whatever = someCondition match {
case 1 => "one"
case 2 => "two"
case 3 => "three"
case _ => "other"
}
Với một chút Scala kinh nghiệm bạn sẽ khám phá ra rằng phong cách này giúp trình biên dịch giúp bạn, và bạn sẽ thấy mình viết chương trình với ít lỗi hơn!
Nguồn
2010-10-27 08:47:34
Trình biên dịch đảm bảo rằng nó thực sự được intialized như thế nào? Có, nó có thể - nhưng khó, và không cần thiết. – delnan
Vì đến thời điểm khởi tạo đó, giá trị là * không xác định * và chỉ có ý nghĩa về dòng điều khiển sau. Trong lập trình hàm, không có giá trị không xác định - và các giá trị - không phải là trạng thái - là những thứ duy nhất quan trọng. – Dario
Vâng, về cơ bản không có "uninitialized". JVM không hỗ trợ khái niệm này. Trong Java, các trường "uninitialized" có giá trị 'null'. Bởi vì cách khởi tạo lớp hoạt động, đôi khi có thể truy cập các trường và nhận được các giá trị rỗng không có thật. Điều này dẫn đến mã có vẻ không tốt, nhưng ném 'NPE' vào lúc chạy. Serialization/RMI thêm nhiều vấn đề hơn cho cách tiếp cận đó. Nếu bạn quan tâm, hãy xem một số ví dụ trong "Java Puzzlers". Về cơ bản: Scala ngăn chặn những điều kỳ lạ xảy ra và làm giảm sự cần thiết cho các giá trị uninitialized, bởi vì tất cả mọi thứ là một biểu thức. – soc