簡體   English   中英

Groovy / Java中有什么方法可以識別調用靜態方法的子類?

[英]Any way in Groovy/Java to identify the subclass calling a static method?

Groovy如此強大,我想知道是否有簡單的方法可以做到這一點。

場景:

我有一個抽象類AbstractSequence 然后,我有兩個(實際上更多)子類,稱為CasedSequenceLowerCaseSequence 這些具體類中的每個類都必須具有“身份映射”,即類似於Set但可以在其中基於功能相等性(覆蓋equalshashCode )提取元素。

因此,我們有:

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方法? AbstractSequence.getIdentityMap()來標識調用getIdentityMap()的子類的類getIdentityMap() ,而不必將此類作為參數傳遞?

PS我寧願不使用Thread.stackTrace :它很麻煩,並且不會提供實際的類對象,只有類名以及Groovy中的堆棧跟蹤是瘋狂的。 我在考慮Groovy反射,Groovy元類等方面的思考更多。

有興趣聽取任何Groovy專家的意見。

同時,我利用了一些Groovy魔術來解決問題,並利用了Groovy GDK在class類中添加了一些方法的事實,其中一個是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來調用上述方法,然后傳遞clazz類的clazz ,該對象從身份映射表提取或構造(並放入映射表)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM