從2.10開始,-Xlint
抱怨包對象內定義的類。但爲什麼?在包對象中定義一個類應該完全等同於在一個單獨的包中使用相同的名稱定義類,除非更方便。爲什麼Scala包中的類不被優先使用?
在我看來,在斯卡拉的嚴重設計缺陷之一是不能把比在文件的頂層一類類似實體上(例如變量聲明,函數定義)的任何其他。相反,你不得不把它們放到一個單獨的'包對象'中(通常在package.scala
),與他們所屬代碼的其餘部分分開,並且違反了一個基本的編程規則,這個規則是概念上相關的代碼應該是物理的相關的。我看不出有任何理由斯卡拉不能讓概念在頂層東西,它允許在較低的水平,以及任何非類像自動被放置在包裝的對象,使用戶不必擔心。
例如,在我的情況下,我有一個util
包,並根據它我有一些子包(util.io
,util.text
,util.time
,util.os
,util.math
,util.distances
等)組的函數,類異構集合和有時在語義上相關的變量。我目前存儲所有的各種功能,類等的package object
坐在稱爲io.scala
或text.scala
或任何文件,在util
目錄。由於功能和類可以混合的方式,這很好,而且非常方便。我可以這樣做:
package object math {
// Coordinates on a sphere
case class SphereCoord(lat: Double, long: Double) { ... }
// great-circle distance between two points
def spheredist(a: SphereCoord, b: SphereCoord) = ...
// Area of rectangle running along latitude/longitude lines
def rectArea(topleft: SphereCoord, botright: SphereCoord) = ...
// ...
// ...
// Exact-decimal functions
class DecimalInexactError extends Exception
// Format floating point value in decimal, error if can't do exactly
formatDecimalExactly(val num: Double) = ...
// ...
// ...
}
沒有這一點,我會很不方便根據樂趣與類,而不是通過語義分割的代碼了。我猜想,另一種方法是將它們放在一個普通的對象中 - 這種方法首先打破了打包對象的目的。
您誤解了我的投訴。如果我有一個包含類和函數的實用程序包,那麼(a)我必須將類和函數分開,前者放在一個包中,後者放在一個名稱相同的包對象中,或者我把它們放在一起包對象,這是「棄用」。分離的問題是,它使得不可能將相關的包和功能保持在一起。 –
我重寫了問題以使問題更清楚。 –
儘管包對象未打開,但其相應的包仍然存在。我大量使用包對象(它們是其他編程語言中的模擬模塊),並且尚未遇到您描述的任何問題。 –