2013-02-17 69 views
1

是否有可能使用公共靜態方法來查找對象實例,該方法需要一個字段對象作爲參數?通過給定的字段對象查找類實例

那是什麼我搜索:

public class Foo { 
    private Bar myObject; 

    public static Foo get(Bar bar) { 
     // return an instance of Foo which has stored a 
     // reference to bar inside myObject or null if not found 
    } 
} 

我希望你明白我的關心。 Google沒有幫助,我只是猜測可能有一個使用Java Reflection的解決方案。非常感謝您的幫助。

回答

0

不,你不能以這種方式回溯田地。 get方法接收的bar參考是拷貝所傳遞的參考文獻。可能有數十個對同一個Bar對象的引用,或者沒有引用。如果系統中有所有Foo對象的列表,則可以找出(通過反思,因爲myObject是私有的),其中Foo對象具有相同的引用,但可能很容易發現有多個對象,或者沒有,因爲無法知道您收到的bar是否被任何Foo實例引用,也沒有任何理由只能由其中一個引用。

2

不,沒有辦法知道這一點。

給定Bar對象可以由Foo的任何數量的實例引用,或者實際上沒有引用。除非你明確地有一個從BarFoo的參考,否則沒有辦法找到它們。

(當然,如果你知道系統中所有的Foo情況下,您可以搜索這種方式...)

0

不容易,我的直覺反應是,除非有一個非常特殊的情況下,你」可能會以錯誤的方式接近問題。

如果您真的需要這樣做,您可以使用instrumentation來註冊您感興趣的類的構造函數,它可能引用Foo,然後在某處保留對創建對象的引用。

然後,您可以隨時瀏覽所有這些引用,並使用反射檢查是否有任何包含您之後的字段類型。

這並不美觀,效率不高,在大多數情況下完全不切實際,但純粹從技術角度回答這個問題是我能想到的唯一方法。

0

不確定這是否與反射,你只需要跟蹤你Foo s,所以你需要保持創建的所有Foos的靜態地圖。

public class Foo { 
    private static final Map<Bar, Foo> BAR_FOO_MAP = new HashMap<>(); 
    private final Bar bar; 

    private Foo(final Bar bar) { 
    this.bar = bar; 
    } 

    public static Foo newInstance(final Bar bar) { 
    final Foo foo = new Foo(bar); 
    BAR_FOO_MAP.put(bar, foo); 
    return foo; 
    } 
    public static Foo findFoo(final Bar bar) { 
    return BAR_FOO_MAP.get(bar); 
    } 
} 

正如指出的別人,除非你有unqiue映射,那麼這將無法工作 - 你可能必須使用一個Map<Bar, Collection<Foo>>甚至guavaMultimap

0

不,我不這麼認爲,但是如果你有一個已知對象的列表(例如使用靜態列表並添加每一個新的距離),你可以創建一個搜索方法來比較bar與場景對象..或者你可以簡單地在這個方法中創建新的實例:)

相關問題