Tôi đang chuyển đổi một số mã Java thành Scala, cố gắng làm cho mã đó thành thành ngữ nhất có thể.Cách thành ngữ để sử dụng Tùy chọn trong Scala
Vì vậy, bây giờ tôi có một số mã bằng cách sử dụng tùy chọn thay vì giá trị nullable, và tôi tự hỏi liệu mọi thứ là scala'ish, hoặc cho dù tôi là sai. Vậy, các bạn có thể chỉ trích đoạn mã sau đây không?
Những lĩnh vực mà tôi đặc biệt tìm kiếm thông tin phản hồi là:
- Việc sử dụng một đối tượng đồng hành như một nhà máy, đưa ra 2 lựa chọn tùy thuộc vào việc chúng ta muốn vượt qua Options hoặc Strings: là chuỗi nhà xây dựng tốt, hoặc chúng ta nên luôn luôn phơi bày thực tế rằng nó là một lựa chọn?
- Việc sử dụng điều kiện tiên quyết: có cách nào tốt hơn để khẳng định thực tế là alpha3Code và tên là bắt buộc hay không và một tùy chọn không null phải được chuyển cho alpha2Code? (Tôi đang sử dụng số Guava cho chuỗi utils, vì tôi chưa tìm thấy bất kỳ thứ gì trong API Scala)
- Việc triển khai hashCode, bằng và toString. bằng và toString đại biểu để Guava một lần nữa, trong khi bằng equals sử dụng phù hợp với mô hình. Có cách nào mở rộng hơn không?
- Tôi biết tôi có thể đã sử dụng các lớp Case, đã tạo ra các triển khai mặc định, nhưng tôi chủ yếu quan tâm đến việc học cách tôi nên triển khai các trường hợp trong trường hợp không thể sử dụng các trường hợp.
Cảm ơn rất nhiều!
package com.sirika.openplacesearch.api.language
import com.google.common.base.Objects
import com.google.common.base.Strings
object Language {
def apply(name : String, alpha3Code : String, alpha2Code : Option[String]) = new Language(name, alpha3Code, alpha2Code)
def apply(name : String, alpha3Code : String, alpha2Code : String = null) = new Language(name, alpha3Code, Option(alpha2Code))
def unapply(l : Language) = Some(l.name, l.alpha3Code, l.alpha2Code)
}
class Language(val name : String, val alpha3Code : String, val alpha2Code : Option[String]) {
require(!Strings.isNullOrEmpty(alpha3Code))
require(!Strings.isNullOrEmpty(name))
require(alpha2Code != null)
override def hashCode(): Int = Objects.hashCode(alpha3Code)
override def equals(other: Any): Boolean = other match {
case that: Language => this.alpha3Code == that.alpha3Code
case _ => false
}
override def toString() : String = Objects.toStringHelper(this)
.add("name", name)
.add("alpha3", alpha3Code)
.add("alpha2", alpha2Code)
.toString()
}
Các "lừa" để sử dụng tùy chọn là chỉ lựa chọn sử dụng và buộc người tiêu dùng phải làm như vậy ;-) Tất nhiên đây không phải là luôn luôn thực tế khi giao dịch với Java (ick!). Chào mừng bạn đến với SO. –
Tôi không nghĩ rằng yêu cầu (alpha2Code! = Null) có thể thất bại vì alpha2Code là một Option – Azzie