gpt4 book ai didi

Java:提供类的过滤 View

转载 作者:行者123 更新时间:2023-11-30 08:40:08 26 4
gpt4 key购买 nike

我有一个包含大量数据的类,我想使用相同的方法在这个对象上公开一个“过滤 View ”,但输出经过修改。举一个非常基本的例子,假设我有这样一个类:

public class Booleans {
private boolean[] data;

public Booleans(boolean[] data) {
this.data = data;
}

public boolean getDataAt(int i) {
return data[i];
}

public Booleans opposite() {
// What to return here? b.opposite().getDataAt(i) should be !b.getDataAt(i)
}
}

有没有好的pattern来写相反的方法?我需要尽可能提高内存效率:数据不能重复,对“相反”的调用最好不要创建任何对象,因为它会被调用多次。

例如,在 Booleans 的构造函数中创建一个小对象就可以了,但此时我不能引用“this”...

最佳答案

如果不创建对象,您就无法逃脱。然而,您可以通过非常便宜的对象创建来逃脱:

private transient Booleans opposite;

static class BooleansOpposite extends Booleans {
Booleans original;

BooleansOpposite(Booleans original) {
super(null);
this.original = original;
}

public Booleans opposite() {
return original;
}

public boolean getDataAt(int i) {
return !original.getDataAt(i);
}
}

public Booleans opposite() {
if (opposite == null) {
opposite = new BooleansOpposite(this);
}
return opposite;
}

这基本上使用装饰器模式来改变 getDataAt 方法的行为。虽然 opposite 的第一次调用创建了一个对象,但您支付的唯一成本是没有数据的 BooleansOpposite,因为它返回到其父对象。如果您更喜欢急切初始化,也可以在构造函数中提前创建相反的实例。

如果 boolean 值只是一个接口(interface)或一个不定义任何成员的纯抽象类,效果会更好,那么 BooleansOpposite 实现就不需要继承无用的字段。

关于Java:提供类的过滤 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35805928/

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