Những lợi thế của các đối tượng đồng hành của Scala so với các phương thức tĩnh là gì?


50

Scala không có từ khóa tĩnh mà thay vào đó có chức năng tương tự thông qua các đối tượng đồng hành. Đằng sau hậu trường, các đối tượng đồng hành được biên dịch thành các lớp có phương thức tĩnh, vì vậy tất cả điều này là đường cú pháp. Những lợi thế của sự lựa chọn thiết kế này là gì? Nhược điểm? Các languanges khác có cấu trúc tương tự?


Câu trả lời:


49

Dưới đây là một vài lý do, có thể ít nhiều hấp dẫn đối với bạn, tùy thuộc vào sở thích của riêng bạn:

  1. Đừng chỉ đơn giản là giảm giá vì nó là "đường cú pháp". Mặc dù bạn có thể nói rằng một cái gì đó chỉ là đường cú pháp, nhưng sau tất cả các loại đường làm ngọt cuộc sống của bạn - với tư cách là một lập trình viên cũng như một người uống cà phê hoặc trà.

  2. Singletons - mỗi Scala objectvốn dĩ là một singleton. Xem xét rằng trong thế giới Java, mọi người đang triển khai các singleton theo đủ mọi cách khác nhau và thường xuyên hơn là không mắc một số lỗi trong quá trình thực hiện, bạn không thể mắc lỗi đơn giản như trong Scala. Viết objectthay vì classlàm cho nó một singleton và bạn đã hoàn thành.

  3. Truy cập vào các phương thức tĩnh: Các phương thức tĩnh trong Java có thể được truy cập từ các đối tượng. Ví dụ, giả sử bạn có một lớp Cvới một phương thức tĩnh fvà một đối tượng ckiểu C. Sau đó, bạn nên gọi C.f, nhưng Java cho phép bạn (mặc dù có cảnh báo) để sử dụng c.f, khi bạn đến từ nền Scala thực sự không có ý nghĩa gì, bởi vì các đối tượng thực sự không có phương thức f.

  4. Xóa tách: Trong Java, bạn có thể trộn các thuộc tính và phương thức tĩnh và không tĩnh trong một lớp. Nếu bạn làm việc có kỷ luật, điều này không trở thành vấn đề, tuy nhiên, nếu bạn (hoặc người khác cho vấn đề đó) không, thì bạn kết thúc với các phần tĩnh và không tĩnh xen kẽ và rất khó để nói nhanh cái gì tĩnh và cái gì không. Trong Scala, mọi thứ nằm trong đối tượng đồng hành rõ ràng không phải là một phần của các đối tượng thời gian chạy của lớp tương ứng, nhưng có sẵn từ một bối cảnh tĩnh. Ngược lại, nếu nó được viết bên trong một lớp, nó có sẵn cho các thể hiện của lớp đó, nhưng không phải từ một bối cảnh tĩnh. Điều này trở nên đặc biệt nặng nề trong Java, khi bạn bắt đầu thêm các khối khởi tạo tĩnh và không tĩnh vào lớp của mình. Điều này có thể rất khó để hiểu theo thứ tự thực hiện động.

  5. Ít mã hơn: Bạn không cần thêm từ tĩnh vào từng thuộc tính hoặc phương thức trong một object, do đó giữ cho mã ngắn gọn hơn (thực sự, không thực sự là một lợi thế nổi bật).

Nhược điểm là khó tìm hơn nhiều. Người ta có thể lập luận rằng các phần tĩnh và không tĩnh phải thuộc về nhau, nhưng được phân tách bằng khái niệm Scala của các đối tượng đồng hành. Ví dụ, có thể có một sơ đồ lớp có vẻ lạ, nhưng sau đó cuối cùng phải tạo hai thứ trong mã và phân tích thuộc tính nào đi đâu.


1
Tôi cũng đọc rằng, số liệu thống kê không thuộc về một phần mềm OOP thuần túy. Giống như, khi bạn cần hành vi tĩnh, sử dụng một lớp riêng và tạo một đối tượng (singleton) của nó, nó quản lý hành vi tĩnh (có khả năng) của các đối tượng của lớp khác.
K ..

1
"Viết đối tượng thay vì lớp làm cho nó trở thành một singleton và bạn đã hoàn thành." Bản thân tôi không quan tâm nhiều đến Singletons, nhưng tôi phải thừa nhận rằng tính trực tiếp của "đường cú pháp" đặc biệt này có một sức hấp dẫn nhất định.
Ed Hastings

3
Không có điểm nào từ 1 đến 5 (và thậm chí tất cả chúng cùng nhau) cần một đối tượng đồng hành thực sự trong thời gian chạy để thực hiện. Tất cả chúng có thể dễ dàng được tạo thành đường cú pháp tinh khiết, với tác động thời gian chạy bằng không. Lý do thực sự duy nhất để có đối tượng đồng hành thời gian chạy được đưa ra trong câu trả lời của Alexey Romanov.
mas.morozov

"Nhược điểm khó tìm hơn nhiều." Hiệu suất? truy cập một phương thức đối tượng tạo ra ifnonnullmã byte vv, so với đơn giản invokeStatic.
Eduardo Pareja Tobes

33

Một lợi ích nữa là objects có thể thực hiện các giao diện / đặc điểm, không giống như các phương thức tĩnh.


8
Tôi nghĩ rằng đây là sự khác biệt chính giữa một đối tượng đồng hành so với một lớp với các phương thức tĩnh. Một đối tượng đồng hành là đa hình và có thể được truyền xung quanh như là một đối số cho các phương thức mong đợi một giao diện / đặc điểm.
dcastro 11/05/2015

4

Các đối tượng đồng hành là nơi đầu tiên được tìm kiếm các ẩn ý, ​​sau đó, scala nhìn vào Predef và sau đó trong các câu lệnh "nhập" rõ ràng trong tệp nguồn cụ thể đó.

Tôi không đủ nhà phát triển java để biết liệu ngôn ngữ hoặc thư viện java có cung cấp bất kỳ cơ chế so sánh nào không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.