2012-10-24 28 views
14

Tôi có một Scala lớp:Khởi tạo một lớp Scala từ Java, và sử dụng các thông số mặc định của các nhà xây dựng

class Foo(val x:String = "default X", val y:String = "default Y") 

tôi muốn gọi nó từ Java, nhưng sử dụng các thông số mặc định

Passing null không hoạt động (nó gán null, như mong đợi)

new Foo(null,null); //both are instantiated as null 

lừa này đã làm việc cho tôi, nhưng nó xấu xí, và tôi tự hỏi, nếu có một cách tốt hơn:

Scala

class Foo(val x:String = "default X", val y:String = "default Y") { 
    def this(x:Object) = this() 
} 

Java

new Foo(null); //no matter what I pass it should work 

Tuy nhiên tôi sẽ muốn loại bỏ thủ thuật quá tải hàm tạo và sử dụng hàm tạo 0 param

Có thể không?

Trả lời

7

Dường như, không có cách nào như vậy: https://issues.scala-lang.org/browse/SI-4278

Issue: mặc định không-args constructor nên được tạo ra cho các lớp học với tất cả tùy chọn đối số
...

Lukas Rytz: về tính đồng nhất về ngôn ngữ, chúng tôi quyết định không sửa lỗi này vì nó là vấn đề về khả năng tương tác với các khung công tác, chúng tôi cho rằng không nên cố định ở cấp độ ngôn ngữ.

cách giải quyết: lặp lại một mặc định, hoặc trừu tượng hơn một, hoặc đặt một mặc định int constructor zero-luận

Sau đó, Lukas đề xuất các giải pháp tương tự như bạn tìm thấy:

class C(a: A = aDefault, b: B = C.bDefault) { 
    def this() { this(b = C.bDefault) } 
} 
object C { def bDefault = ... } 

// OR 

class C(a: A = aDefault, b: B) { 
    def this() { this(b = bDefault) } 
} 
1

More thường nếu bạn có một lớp Scala với arg mặc định và bạn muốn khởi tạo trong Java ghi đè 0, 1 hoặc nhiều giá trị mặc định mà không cần phải chỉ định tất cả, hãy xem xét mở rộng API Scala để bao gồm một Builder trong đối tượng đồng hành.

case class Foo(
    a: String = "a", 
    b: String = "b", 
    c: String = "c") 

object Foo { 
    class Builder { 
    var a: String = "a" 
    var b: String = "b" 
    var c: String = "c" 
    def withA(x: String) = { a = x; this } 
    def withB(x: String) = { b = x; this } 
    def withC(x: String) = { c = x; this } 
    def build = Foo(a, b, c) 
    } 
} 
Các vấn đề liên quan