【问题标题】:return "constant" value from method java从方法 java 返回“常量”值
【发布时间】:2012-05-10 13:31:37
【问题描述】:

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

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

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

    return foo.getX();
}

这样可以吗?

【问题讨论】:

  • 您是否有特殊原因要在没有实例变量的情况下执行此操作?
  • 这是一个学校练习/比赛。我们正在创造一个游戏,我们可以对这个游戏做出哪些改变有一些规则。其中之一是我们不能添加更多的实例变量。

标签: java memoization


【解决方案1】:

知道它是否曾被访问过

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      不使用实例变量?不,这是不可能的。您需要一种方法让该方法在调用之间“记住”某些东西——局部变量不起作用,它必须是在方法调用之外“存在”的东西。这就是实例变量的作用:保存状态,对所有实例方法可见。

      【讨论】:

      • 好的,谢谢您的回复。那么我也需要弄清楚其他事情:)
      【解决方案4】:

      您可以使用缓存。从缓存中读取以查找输入。如果输入已经在缓存中,则从缓存中返回值。如果没有,则将该条目放入缓存中并返回新的计算值。

      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);
      

      正在寻找:

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

      对于删除:

      cache.remove("key1");
      

      您可以将其保存到磁盘。

      更多信息,请参阅http://ehcache.org/

      【讨论】:

      • 我这种情况,我需要将CacheManager声明为实例变量对吧?
      • 像一个静态变量并在静态块中初始化
      • 我不能在这个方法之外写任何变量。实际上,我也只有其他方法可以使用。
      • 可以写入文件以存储值吗?
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-11
        • 2020-11-28
        • 2014-09-05
        • 2014-05-12
        相关资源
        最近更新 更多