0

我似乎无法用java思考。我想要的是一个函数,它接受两个函数作为参数,并执行其中一个,检查缓存未命中,如果有则执行第二个。如果不重写子类/接口实现中的所有函数定义,我无法弄清楚如何在 java 中执行此操作。

那么,我将如何写类似的东西

def(cacheFun, diskFun){
  String astring = cacheFun.call()
  if(!isBlank(astring)){
    return astring
  } else {
    return diskFun.call()
  }
}

在java中?

不想要的是一堆匿名类,它们在接口下实现了我想要的功能(至少不是我想的那样)。有许多以不同方式处理缓存的函数。这意味着超类必须为每种缓存方式提供一个函数。

public String getUsingWayOne(){
  String retval = WayOneCacheClass.new.execute()
  if(retval is not empty){
    return retval
  } else {
    retval = WayOneDiskClass.new.execute()
    return retval
  }
}

并针对所有不同的缓存方式重复此操作

在java中有解决方法吗?请不要建议缓存库。这个问题的目的不是实际缓存东西,而是学习以“正确”(java)方式编写代码。

4

2 回答 2

1

有几种方法可以像您在 Java 中谈论的那样,但我认为主要是您不应该考虑传递函数指针。在 Java 中,关键是你总是从对象的角度来思考,接口和继承是你的朋友。

听起来您有很多实现,它们都是公共超类的子类,并且您想要一种方法可以测试一个方法以查看是否发生缓存命中并在发生未命中时调用另一个方法。为此,我的第一个倾向是让实现从Abstract Class继承。抽象类类似于接口,因为它们定义了一个接口,但它们也可以定义不需要由每个子类实现的通用方法。所以,你可以这样写:

public abstract class FunCache {
  public String getValue() {
    String result = cacheFun();
    if (result == null) {
      result = diskFun();
    }
    return result;
  }

  abstract public String cacheFun();
  abstract public String diskFun();
}

class FirstImplementation extends FunCache {
  public String cacheFun() {
    // implementation!
  }

  public String diskFun() {
    // implementation!
  }
}

// some other code that wants to use it
FunCache fc = new FirstImplementation();
String value = fc.getValue();
于 2013-08-13T21:51:12.343 回答
0

在java中,你可以做(​​你的代码的音译):

public String getUsingWayOne(){
   String retval = WayOneCacheClass.execute();
   if (retval != null && !retval.isEmpty()) {
       return retval;
   return WayOneDiskClass.execute();
}

请注意,我已将execute()方法设为静态,因为它显然是无状态的。


或者您可以在一个实例中设置两种方式(不知道更多,这就是我要做的):

public interface Cacher {
    execute();
}

public class TwoWayCacher {
    private final Cacher one;
    private final Cacher two;

    public TwoWayCacher (Cacher one, Cacher two) {
        this.one = one;
        this.two = two;
    }

    public String get() {
       String retval = one.execute();
       if (retval != null && !retval.isEmpty()) {
           return retval;
       return two.execute();
    }
}

然后使用:

TwoWayCacher cacher = new TwoWayCacher(new WayOneCacher(), new WayTwoCacher());

String result = cacher.get();
于 2013-08-13T21:33:34.000 回答