2017-05-09 101 views
1

我作爲是否可以檢查一個特質的對象是否已經初始化?

trait MyTrait { 
    // blah 
} 

object MyTrait { 
    // Check to see if OtherTrait has been used/initialized yet 
    try { 
    val c = Class.forName("...OtherTrait") 
    println("found " + c.getName) 
    . . . 
    } catch { 
    case classNotFoundException : ClassNotFoundException => 
     println("ClassNotFoundException: " + classNotFoundException.getMessage) 
    } 
} 

這種特性將代碼是什麼樣子,看看OtherTrait的對象是否已經被初始化,這樣,我不希望它初始化作爲檢查的副作用?

這似乎是一個反射的東西,我知道如何檢查Class.forName以查看「... OtherTrait」是否可以從類加載器,但即使類加載器可以找到它,我想知道它是否已經初始化。也就是說,如果沒有其他人使用它,我不想使用它。

+0

這裏的大圖是什麼?你能解釋一下爲什麼你不希望你的特質成爲第一個使用這個其他類的特質? – Tyler

回答

1

如何使用另一個對象來跟蹤特徵的初始化狀態?

object OtherTraitMarker { 
    private var _isInitialized = false 
    def isInitialized = _isInitialized 
    private[OtherTrait] def initialize() = _isInitialized = true 
} 

trait OtherTrait { 
... expensive work 
OtherTraitMarker.initialize 
} 

object MyTrait { 
    // Check to see if OtherTrait has been used/initialized yet 
    if (OtherTraitMaker.isInitialized) { 
    // do some work 
    } 
} 

[請注意,我恭敬地但強烈與另一應答人們永遠也不應該在類的初始化塊修改狀態所做的聽寫不同意。這正是爲什麼初始化塊存在。那麼他們的觀點是什麼?]

+0

謝謝,這真的很簡單,沒有反射需要,像我的應用程序的魅力。 基本上我有一堆初始化特徵,日誌的一些輸出。如果我的特徵LogbackLogging被初始化,那麼我使用logger.info(),否則我使用println()。如果用戶使用Logback或其他日誌記錄方法,我希望用戶有一個選擇。 –

0

1)你不應該在類初始化塊中放置帶副作用的代碼。如果代碼依賴於類初始化順序或類似的東西,那麼它違反了所有現有的編程範例。

2)如果您確實需要檢查它,您可以遍歷類路徑中的所有.jar歸檔並嘗試找到一個類。當然,它僅適用於從classpath加載的類。

相關問題