我正在尝试使用Scala解析来自artist.getInfo的last.fm来电。 scala的Xml API真的很棒,但我有一个设计问题(也许是个人风格)。
目前,我正在从伴随对象中的XML解析数据,并将它们交给类的构造函数,如下所示:
class ArtistProfile (
name: String,
musicBrainzId: String,
url: String,
images: List[Image],
streamable: Boolean,
listeners: Int,
plays: Int,
similarArtists:List[SimpleArtist])
object ArtistProfile {
def apply(xml: NodeSeq) : ArtistProfile = {
val root = xml
val name = SimpleArtist.extractName(root);
val url = SimpleArtist.extractUrl(root);
val musicBrainzId = root \ "musicBrainzId" text
val images:List[Image] = Image.findAllIn(root)
val streamable = (root \ "streamable" text) eq ("1")
val listeners = (root \ "stats" \ "listeners").text.toInt
val plays = (root \ "stats" \ "plays").text.toInt
new ArtistProfile(
name,
url,
musicBrainzId,
images,
streamable,
listeners,
plays,
SimpleArtist.findAllIn(xml \ "similar"))
}
}
如您所见,这些是很多参数。我的问题是,将xml NodeSeq传递给ArtistProfile构造函数是否是一种更好的样式(就scala的功能而言),因此类本身接管解析而不是伴随对象。
我问这个是因为我正在尝试编写自己的last.fm scala库(作为scala的入门项目),我希望所有对象都能保持一致。
哪种方法可以更好地解决问题?
答案 0 :(得分:4)
我不确定是否有这样的黑白答案。您可以在类中放置辅助构造函数,以便您也可以从xml节点创建实例,而无需伴随对象。
然而,有充分的理由支持工厂模式。
工厂模式的主要缺点(假设您将主构造函数设为私有),如 Effective Java 中所述,是用户无法创建子类。
我会将它们全部放在伴侣对象中。