2010-03-29 31 views
7

tôi đang học Scala, và tôi không thể tìm ra cách để thể hiện tốt nhất lớp Java đơn giản này trong Scala:tương đương của các lĩnh vực thức public static trong Scala

public class Color { 
    public static final Color BLACK = new Color(0, 0, 0); 
    public static final Color WHITE = new Color(255, 255, 255);  
    public static final Color GREEN = new Color(0, 0, 255); 

    private final int red; 
    private final int blue; 
    private final int green; 

    public Color(int red, int blue, int green) { 
    this.red = red; 
    this.blue = blue; 
    this.green = green; 
    } 

    // getters, et cetera 
} 

Điều tốt nhất tôi có là như sau:

class Color(val red: Int, val blue: Int, val green: Int) 
object BLACK extends Color(0, 0, 0) 
object WHITE extends Color(255, 255, 255) 
object GREEN extends Color(0, 0, 255) 

Nhưng tôi mất lợi thế khi có BLACK, WHITE và GREEN được gắn với không gian tên màu.

Trả lời

13

Bạn chỉ có thể đặt các màu sắc cụ thể vào đối tượng bạn đồng hành:

class Color(val red: Int, val blue: Int, val green: Int) 
object Color { 
    object BLACK extends Color(0, 0, 0) 
    object WHITE extends Color(255, 255, 255) 
    object GREEN extends Color(0, 0, 255) 
} 

EDIT:

Ngoài ra, bạn có thể có Vals trong đối tượng đồng:

class Color(val red: Int, val blue: Int, val green: Int) 
object Color { 
    val BLACK = new Color(0, 0, 0) 
    val WHITE = new Color(255, 255, 255) 
    val GREEN = new Color(0, 0, 255) 
} 

Bạn có thể khiến họ lười biếng để trì hoãn insta ntiation cho đến khi chúng được sử dụng:

class Color(val red: Int, val blue: Int, val green: Int) 
object Color { 
    lazy val BLACK = new Color(0, 0, 0) 
    lazy val WHITE = new Color(255, 255, 255) 
    lazy val GREEN = new Color(0, 0, 255) 
} 

Quay trở lại các giải pháp ban đầu, bạn có thể ngăn chặn sự mở rộng của lớp (mô phỏng "cuối cùng" bằng cách làm cho lớp màu kín:

sealed class Color(val red: Int, val blue: Int, val green: Int) 
object Color { 
    object BLACK extends Color(0, 0, 0) 
    object WHITE extends Color(255, 255, 255) 
    object GREEN extends Color(0, 0, 255) 
} 
+0

(Tôi không phải là người Scala. Điều đó có hiệu quả đối với các lớp "cuối cùng" không?) –

+1

Bạn không thể mở rộng lớp cuối cùng, nhưng bạn có thể làm cho nó "kín" để không thể mở rộng ra ngoài bộ biên dịch hiện tại . –

17
case class Color(red: Int, blue: Int, green: Int) 

object Color { 
    val BLACK = Color(0, 0, 0) 
    val WHITE = Color(255, 255, 255) 
    val GREEN = Color(0, 0, 255) 
} 
+7

Một lưu ý ngoài, quy ước Scala là sử dụng PascalCase cho các hằng số, chẳng hạn như 'Black'. – missingfaktor

1

kín cho phép tiện ích mở rộng đối tượng có cùng tệp vật lý..không có trong tệp khác. niêm phong là gần gũi hơn với phạm vi gói hơn cuối cùng.

Các vấn đề liên quan