Tôi có một số mã bất biến mà đối tượng phải được xây dựng trong hàm mà nó được sử dụng cuối cùng (vì nhiều lý do liên quan đến trạng thái toàn cầu không lý tưởng. của giả định).Kiểm tra thời gian biên dịch Scala cho vị trí của các hàm tạo (constructor)
ví dụ: Giả sử có hàm boo bên dưới có trách nhiệm thao tác moo.
def boo(mooGen:() => Moo) {
val m = mooGen() // a new MOO must be created HERE
m.moo()
}
Khách hàng của boo muốn sử dụng phải vượt qua một loại() => Moo, trong đó chức năng tạo Moo mong muốn.
lý tưởng hành vi khách hàng:
boo(() => new Moo(// specific parameters here))
Các Moo không được tạo ra cho đến khi bên trong cơ thể boo.
Tuy nhiên, một khách hàng có thể dễ dàng sai lầm với đoạn mã sau:
val myMoo = new Moo(// specific parameters here)
boo(() => myMoo)
này phá vỡ bất biến mà chúng ta muốn xây dựng moo xảy ra chỉ trong boo. Vì vậy, về cơ bản, tôi muốn xác định xem giá trị trả về của mooGen có được tạo trong ngăn xếp cuộc gọi của hàm hay liệu nó đã được tạo trước đó hay chưa.
Có nhiều cách để xác minh điều này khi chạy. Tuy nhiên, có cách nào để buộc mẫu này tại số biên dịch không? Sử dụng implicits hoặc bất cứ điều gì khác thông minh?
Bất kỳ ý tưởng nào được đánh giá cao!