Groovy/Java中有没有任何方法可以识别调用静态方法的子类?

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

Groovy是如此强大,我想知道是否有一种简单的方法可以做到这一点

情景:

我有一个抽象类,
AbstractSequence
。然后我有两个(实际上更多)子类,分别称为say
CasedSequence
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调用上述方法,然后交付一个class
clazz
的对象,该对象可以是从身份映射中提取的,也可以是构造的(并放入映射中)

“事实上,由于需要花费很长时间来解释的原因,在各个类中操纵这些标识映射也会使用很多静态方法,从一个子类到另一个子类都是类似/相同的。“…Java/Groovy处理类似问题的方法是在接口中定义API,在这种情况下很可能是泛型的,然后在抽象类中编写尽可能多的框架实现,完全取消静态方法,并覆盖
getIdentityMap()
方法在每个具体的子类中。您可以传递类型标记来标识子类。“完全取消静态方法”。当我说无法完成时,您能接受吗?可能可以通过一些“管理”来实现“辅助班。。。但是这也会非常复杂。为什么不使用一个非静态的
getIdentityMap()
方法来调用静态的
getIdentityMap(getClass())
?@jtahlborn事实上,您通常需要在静态上下文中获取这个标识映射,所以没有对象可以调用
getIdentityMap()
。如果您是在静态上下文中获取此标识映射,则您没有类类型。。。这没有任何意义?