gpt4 book ai didi

java - 在调用几个重载方法中的任何一个后调用一次方法

转载 作者:行者123 更新时间:2023-11-30 02:18:31 25 4
gpt4 key购买 nike

在一个抽象类中,我有一个 Predicate 字段,它是未知数量的其他 Predicate 的组合。连接谓词工作得很好,但我试图有某种方法来知道谓词何时被初始化(或者更确切地说,只是一种知道它是否已初始化的方法)。

以下是我所讨论内容的一个简短示例:

public abstract class LimitedSystem implements Moveable {

private Predicate<Double> limits;
private final boolean initialized;

public void setLimits(SingleLimit... limits) {

List<Predicate<Double>> limitsList = Arrays.asList(limits);
this.limits = limitsList.stream().reduce(Predicate::and).orElse(x -> true);
}

public void setLimits(TwoLimits limits) {
this.limits = limits;
}
...

我正在寻找将initialized设置为true一次(并且仅一次,因此是final)的方法。我认为我使用正确) 任何 setLimits 已被调用(它们已重载)。

我还有其他 setLimits 方法,但为了通用代码,我不想在每个重载方法的末尾放置 initialized

所以我的问题是,在调用任何 setLimits 方法后,如何以通用方式设置 initialized 的值。

我的第一个想法是尝试将 setLimits 包装在一些通用方法中,该方法将通过它获取的参数调用正确的重载,然后更改该方法中的initialized 。但我不确定这是否是一个好主意。

我从另一个问题中得到的一些其他想法 1 是将 setLimits 放入某个界面或类似的东西中。但我不确定这有多大用处。

那么这如何实现呢?

(另外,如果您碰巧注意到其中的任何设计问题,请告诉我,因为我正在努力改进这方面)

最佳答案

不需要单独的字段:

private Predicate<Double> limits;
private final boolean initialized;

基本上是

private Optional<Predicate<Double>> limits = Optional.empty();

如果您希望在设置 limits 后将 initialized 设置为 true,前提是您可以保证没有任何 setLimits 方法可以再次将其设置为 Optional.empty()初始化==limits.isPresent()

<小时/>

您不能保证在重写方法的主体中调用方法;无论如何,这是 Call super antipattern 的变体.

你可以这样做:

abstract class Base {
final void setFoo(Object param) { // final, so can't be overridden.
setFooImpl(param);
thingThatMustBeCalled();
}

protected abstract void setFooImpl(Object param);

final void thingThatMustBeCalled() { ... }
}

class Derived extends Base {
@Override protected void setFooImpl(Object param) { ... }
}

但是实在是太丑了

关于java - 在调用几个重载方法中的任何一个后调用一次方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47549943/

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