Tôi đã nhìn vào ví dụ về khai thác gỗ tại Scala, và nó thường trông như thế này:Làm cách nào để đăng nhập vào Scala * mà không có * tham chiếu đến trình ghi nhật ký trong * mọi trường hợp *?
import org.slf4j.LoggerFactory
trait Loggable {
private lazy val logger = LoggerFactory.getLogger(getClass)
protected def debug(msg: => AnyRef, t: => Throwable = null): Unit =
{...}
}
này dường như không phụ thuộc vào khung đăng nhập cụ thể. Trong khi điều này thực hiện công việc, nó cũng giới thiệu một val lười biếng không liên quan trong mọi trường hợp muốn ghi nhật ký, cũng có thể là mọi phiên bản của toàn bộ ứng dụng. Điều này có vẻ quá nặng nề với tôi, đặc biệt nếu bạn có nhiều "trường hợp nhỏ" của một số loại cụ thể.
Có cách nào để đặt nhật ký trong đối tượng của lớp bê tông thay vào đó, chỉ bằng cách sử dụng thừa kế? Nếu tôi phải khai báo một cách rõ ràng logger trong đối tượng của lớp, và đề cập rõ ràng nó từ lớp/đặc điểm, thì tôi đã viết gần như nhiều mã như thể tôi đã không sử dụng lại.
bày tỏ trong một đăng nhập phi bối cảnh cụ thể, vấn đề sẽ là:
Làm thế nào để tuyên bố trong một đặc điểm mà các lớp thực hiện phải có một đối tượng singleton loại X, và rằng đối tượng singleton này phải được truy cập thông qua phương pháp def x: X?
Tôi không thể chỉ định nghĩa phương thức trừu tượng, bởi vì chỉ có thể có một triển khai đơn lẻ trong lớp. Tôi muốn việc đăng nhập vào một lớp học siêu hạng đã giúp tôi trở thành một singleton siêu đẳng cấp, và việc đăng nhập vào lớp phụ sẽ giúp tôi trở thành một singleton lớp nhỏ. Hay đơn giản hơn, tôi muốn đăng nhập vào Scala để làm việc giống như việc ghi nhật ký truyền thống trong Java, sử dụng các trình ghi log tĩnh cụ thể cho lớp đang thực hiện việc ghi nhật ký. Kiến thức hiện tại của tôi về Scala nói với tôi rằng điều này đơn giản là không thể nếu không thực hiện nó giống như cách bạn làm trong Java, mà không có nhiều lợi ích nếu sử dụng Scala "tốt hơn".
Nếu class SomethingElse mở rộng class Dù sao, và ghi đè meta để trỏ tới singleton riêng của nó, thì đột nhiên doSomething sẽ đăng nhập vào singleton đó, và nếu SomethingElse không, thì đầu ra log của SomethingElse sẽ đi tới singleton của Any.Trong nhật ký Java tĩnh "truyền thống", đầu ra nhật ký bị ràng buộc tĩnh, vì vậy khi bạn nhìn thấy một thông báo, bạn biết trong đó lớp sẽ tìm kiếm nó. Không phải như vậy trong giải pháp của bạn. –
Đó có phải là một vấn đề lớn? Khi tôi hiểu điều này, bạn có thể kế thừa hoặc ghi đè, cả hai đều hợp lý. doSomething không đột nhiên đăng nhập vào singleton riêng của nó, nó chỉ làm như vậy khi bạn đã yêu cầu nó một cách rõ ràng bằng cách ghi đè meta. –