gpt4 book ai didi

java - 如何在函数调用中强制顺序

转载 作者:太空狗 更新时间:2023-10-29 22:32:26 25 4
gpt4 key购买 nike

假设我想设计一个类,其客户需要按特定顺序调用函数,例如,

hasNext();
next();

或者,作为一个非常通用的示例,类 CookFood 具有以下方法:

class CookFood {
getListOfItems();
mixAllItems();
heat();
}

在第二个例子中,我想强制只有在拿到元素后才进行混合,并且只有在混合后才进行加热。是否有任何已知的模式或良好做法来强制执行函数调用顺序?

最佳答案

您可能对 Step Builder Pattern 感兴趣.它不一定适合您提出的所有情况,但想法是每个操作都会返回一些实现接口(interface)的东西,让您可以执行下一个操作。由于您只能通过以正确的顺序执行操作来获取对象,因此您将被迫以正确的顺序执行它们。

虽然在迭代(next/hasNext)的情况下会感觉有点勉强,但是你可以想象一下

  • 穿上你的 socks ,
  • 然后穿上你的鞋子

图案。您以某种方式获得了 CanWearSocks 接口(interface)的实例,它只有以下方法。

CanWearShoes putOnSocks()

当您调用 putOnSocks() 时,您会得到您的 CanWearShoes 实例,它只有以下方法。

SockAndShoeWearer putOnShoes()

当您调用 putOnShoes() 时,您现在有了穿 socks 和鞋子的东西,并且您必须按正确的顺序执行。

特别好的是你实际上可以在两种情况下使用同一个对象,但是因为方法签名只返回接口(interface)类型,代码将只能使用接口(interface)方法(除非代码是偷偷摸摸的,并且将对象为不同的类型)。

例子

这是一个实现迭代模式的相当人为的示例,即确保您在 NextGetter 之前使用 NextChecker。

public class StepBuilderIteration {

interface NextChecker {
NextGetter hasNext();
}

interface NextGetter {
Object next();
NextChecker more();
}

static class ArrayExample {
final static Integer[] ints = new Integer[] { 1, 2, 3, 4 };

public static NextChecker iterate() {
return iterate( 0 );
}

private static NextChecker iterate( final int i ) {
return new NextChecker() {
public NextGetter hasNext() {
if ( i < ints.length ) {
return new NextGetter() {
public Object next() {
return ints[i];
}
public NextChecker more() {
return iterate( i+1 );
}
};
}
else {
return null;
}
}
};
}
}

public static void main(String[] args) {
NextChecker nc = ArrayExample.iterate();
while (nc != null) {
NextGetter ng = nc.hasNext();
if (ng != null) {
System.out.println(ng.next());
nc = ng.more();
}
}
}
}

输出是:

1
2
3
4

关于java - 如何在函数调用中强制顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17256627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com