Groovy/Java中有没有任何方法可以识别调用静态方法的子类?
Groovy是如此强大,我想知道是否有一种简单的方法可以做到这一点 情景: 我有一个抽象类,Groovy/Java中有没有任何方法可以识别调用静态方法的子类?,java,groovy,subclass,static-methods,abstract,Java,Groovy,Subclass,Static Methods,Abstract,Groovy是如此强大,我想知道是否有一种简单的方法可以做到这一点 情景: 我有一个抽象类,AbstractSequence。然后我有两个(实际上更多)子类,分别称为sayCasedSequence和LowerCaseSequence。这些具体类中的每一个都必须有一个“标识映射”,即类似于集合,但可以基于函数相等性提取元素(覆盖等于和哈希代码) 因此,我们: class CasedSequence extends AbstractSequence { static Map identit
AbstractSequence
。然后我有两个(实际上更多)子类,分别称为sayCasedSequence
和LowerCaseSequence
。这些具体类中的每一个都必须有一个“标识映射”,即类似于集合
,但可以基于函数相等性提取元素(覆盖等于
和哈希代码
)
因此,我们:
class CasedSequence extends AbstractSequence {
static Map identityMap = [:]
...
class LowerCaseSequence extends AbstractSequence {
static Map identityMap = [:]
事实上,由于需要花费很长时间来解释的原因,在各个类中操纵这些标识映射也会使用很多静态方法,从一个子类到另一个子类都是类似/相同的。所以我想知道如何进行重构,将标识映射放到抽象基类中(然后在抽象基类中迁移大量重复的静态方法)
这让我想到:
abstract class AbstractSequence {
static Map getIdentityMap( Class clazz ) {
if( ! ( clazz in identityMaps ))
identityMaps[ clazz ] = [ : ]
identityMaps[ clazz ]
}
static Map identityMaps = [:]
然后在具体的类中,每次您想要使用身份映射时,都必须执行以下操作:
class CasedSequence extends AbstractSequence {
def someMethod( CasedSequence seq1 ){
CasedSequence seq2 = getIdentityMap( CasedSequence )[ seq1 ]
...
再说一次,解释为什么需要用这种方式检索东西太复杂了。。。但是我只是想知道在AbstractSequence.getIdentityMap()
中是否有一种方法(一种优雅的Groovy方法?)来识别调用getIdentityMap()的子类的类,而不是将该类作为参数传递
PS我不想使用Thread.stackTrace
:它很麻烦,而且不会提供实际的类对象,Groovy中只有类名和堆栈跟踪是野生的。我更多地考虑Groovy反射、Groovy元类 会有兴趣从任何一位Groovy大师那里听到这一点
与此同时,我使用了一些Groovy魔术作为解决方法,利用Groovy GDK向类
类添加了一些方法,其中一个方法是newInstance()
——非常有用。这将“生成或获取”序列对象,具体取决于所查找的序列是否已在标识映射中
static makeOrGet( String string, Class clazz ) {
def dummySeq = clazz.newInstance( DUMMY_STRING )
// NB the constructor identifies the string DUMMY_STRING to prevent this new object being
// properly "registered" (i.e. put in the identity map), which would be wrong because
// the dummy seq is just to find out whether the sequence with "string" is actually
// present in the map
def seq
// disguise the dummy sequence to flush out an existing sequence with String "string"
dummySeq.string = string
if( dummySeq in getIdentityMap( clazz ) )
seq = getIdentityMap( clazz )[ dummySeq ]
else
// NB constructor puts the new "clazz" object in the identity map
seq = clazz.newInstance( string )
seq
}
。。。因此,可以使用各种不同的类作为参数2调用上述方法,然后交付一个classclazz
的对象,该对象可以是从身份映射中提取的,也可以是构造的(并放入映射中)“事实上,由于需要花费很长时间来解释的原因,在各个类中操纵这些标识映射也会使用很多静态方法,从一个子类到另一个子类都是类似/相同的。“…Java/Groovy处理类似问题的方法是在接口中定义API,在这种情况下很可能是泛型的,然后在抽象类中编写尽可能多的框架实现,完全取消静态方法,并覆盖getIdentityMap()
方法在每个具体的子类中。您可以传递类型标记来标识子类。“完全取消静态方法”。当我说无法完成时,您能接受吗?可能可以通过一些“管理”来实现“辅助班。。。但是这也会非常复杂。为什么不使用一个非静态的getIdentityMap()
方法来调用静态的getIdentityMap(getClass())
?@jtahlborn事实上,您通常需要在静态上下文中获取这个标识映射,所以没有对象可以调用getIdentityMap()
。如果您是在静态上下文中获取此标识映射,则您没有类类型。。。这没有任何意义?