2012-04-30 47 views
1

我不太確定這是否可能,所以這就是爲什麼我問你們。我想寫一個方法,知道它是否曾被訪問過,以及它是否返回了它上次訪問過的相同值。我無法爲此使用字段/實例變量。返回來自方法java的「常量」值

這是要我想做的事情,沒有實例變量foo的:

private FooObject foo = null; 
public int setFoo(FooObject in) 
{ 
    if(foo == null) 
     foo = in; 

    return foo.getX(); 
} 

能這樣做嗎?

+0

可能的重複[在Java中有哪些不同的memoization技術?](http://stackoverflow.com/questions/3623754/what-are-the-different-techniques-for-memoization-in-java) – skaffman

+1

有沒有特定的原因,爲什麼你想這樣做沒有實例變量? – trutheality

+0

這是一個學校練習/比賽。我們正在製作一款遊戲,而且我們可以對這款遊戲進行哪些更改。其中之一是我們不能添加更多的實例變量。 – KLIM8D

回答

5

,如果它之前已經

知識發生了什麼走訪,知道之前需要內存,又名state。所以你需要一些東西來存儲這些知識;你無法避免它。

+0

例如,首選項API?可能有點麻煩,但... – wchargin

0

不使用實例變量?不,這是不可能的。你需要一種讓方法「記住」調用之間的東西的方法 - 局部變量不起作用,它必須是在方法調用之外「生存」的東西。這就是實例變量的用途:保存狀態,從所有實例方法都可見。

+1

好的,謝謝你的回覆。我也需要找出其他的東西:) – KLIM8D

1

我同意@奧利查爾斯沃斯,你不能沒有國家這樣做。但是使用字段來保存狀態只是衆多選項之一。例如,您可以使用System.setProperty()和System.getProperty()將狀態保存爲系統屬性,或者將狀態保存到文件中。你甚至可以將狀態保存到數據庫中。

0

您可以使用緩存。從緩存中讀取以查找輸入。如果輸入已經在緩存中,則從緩存中返回值。如果不這樣,則將條目放入緩存並返回新的計算值。

CacheManager singletonManager = CacheManager.create(); 
Cache memoryOnlyCache = new Cache("testCache", 5000, false, false, 5, 2); 
manager.addCache(memoryOnlyCache); 
Cache cache = singletonManager.getCache("testCache"); 

提出了新的條目

Element element = new Element("key1", "value1"); 
cache.put(element); 

尋找在chache:

Element element = cache.get("key1"); 
Object value = element.getObjectValue(); 

對於刪除:

cache.remove("key1"); 

你能堅持這個磁盤。

欲瞭解更多信息,請參閱http://ehcache.org/

+0

我這種情況下,我需要將CacheManager聲明爲實例變量嗎? – KLIM8D

+0

像靜態變量並在靜態塊 –

+0

中初始化,我無法在此方法外寫入任何變量。我只有其他方法可以使用。 – KLIM8D

0

你可以使用Preferences API。這允許您跨應用程序負載存儲內存,因此如果您希望每次加載時都重新啓動它,則需要set a shutdown hook來清除Preferences API中的值。