2017-05-09 102 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加载的类。

相关问题