从方法java返回“常量”值

时间:2012-04-30 21:12:09

标签: java memoization

我不太确定这是否可能,所以这就是我问你们的原因。我想写一个方法,知道它之前是否已被访问过,如果它返回了它上次访问时的相同值。我不能为此使用字段/实例变量。

这是我想要做的,没有实例变量foo:

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

    return foo.getX();
}

可以这样做吗?

5 个答案:

答案 0 :(得分:5)

  

知道是否在

之前访问过它

了解之前发生的事情需要记忆,即state。因此,你需要一些东西来存储这些知识;你无法避免它。

答案 1 :(得分:1)

我同意@Oli Charlesworth,如果没有州,你就不能这样做。但是使用字段来保存状态只是众多选项中的一种。例如,您可以使用System.setProperty()和System.getProperty()将状态保存为系统属性,或将状态保存到文件中。您甚至可以将状态保存到数据库中。

答案 2 :(得分:0)

不使用实例变量?不,它无法完成。你需要一种方法让方法“记住”调用之间的某些东西 - 局部变量不起作用,它必须是“生活”在方法调用之外的东西。这就是实例变量的用途:保存状态,从所有实例方法中可见。

答案 3 :(得分: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/

答案 4 :(得分:0)

您可以使用Preferences API。这允许您跨应用程序加载存储内存,因此如果您希望每次加载时重新启动内存,则需要set a shutdown hook清除Preferences API中的值。