gpt4 book ai didi

java - 像处理单个实例一样处理实例数组

转载 作者:搜寻专家 更新时间:2023-11-01 03:09:25 28 4
gpt4 key购买 nike

在 Java 中,我正在寻找一个通用模板,这意味着给定类型的数组(例如 Foo)将允许对该数组进行实例方法调用。在幕后,这将转化为遍历数组中的所有 Foo 实例,并在每个实例上调用实例方法。

也许一些代码可以更好地证明这一点:

public class Foo{

public Foo(){}

public void Method1(){}

}

所以你有:

Foo foo = new Foo();
foo.Method1();

但是您能否为您的自定义类型制作一些通用模板,从而固有地使这种事情成为可能:

Foo[] foos = new Foo[]{new Foo(),new Foo(), new Foo()};
foos.Method1();

本质上是语法糖:

foreach(Foo f : foos){
f.Method1();
}

我的动机是让某人可以这样使用可变参数:

someHelper(fooInstance1,fooInstance2).Method1()

其中 someHelper() 返回 Foo[]

如果每个 Method1() 调用都返回一个值,如果将其包装到一个返回值数组中会更好(其中 ReturnVals.size == Foos.size)。

在最坏的情况下,我必须为我需要为其工作的每种类型编写一个单独的类来实现此目的,可能使用接口(interface)来描述适用于单个实例和实例数组的功能。

是否有任何 Java 魔术、设计模式或通用拼图游戏可以优雅地实现这一点?

此外,如果没有,是否有任何语言天生就促进了这一点?

我明白它不会适用于所有场景,但我认为这取决于程序员。

非常感谢

最佳答案

您正在调用 Composite Pattern .您可以在项目 PerfectJPattern 中找到组件化的通用且可重用的实现确保检查复合 documentation pageexample与 GoF 书中的示例相匹配。

示例相关部分的逐字副本,假设您有 IGraphic 接口(interface)和一些实现,例如矩形和直线,那么你可以这样做:

// build the composite
IComposite<IGraphic> myComposite = new Composite<IGraphic>(IGraphic.class);
myComposite.add(new Rectangle());
myComposite.add(new Line());
myComposite.add(new Line());

// use the composite, invokes the IGraphic#draw() in the
// underlying Rectangle and two Line instances
myComposite.getComponent().draw();

这是针对您的具体情况的工作方式:

Foo fooInstance1 = new Foo();
Foo fooInstance2 = new Foo();
IComposite<Foo> myComposite = new Composite<Foo>(Foo.class);
myComposite.add(fooInstance1);
myComposite.add(fooInstance2);
// invokes Method1 on instance1 and instance2 transparently
myComposite.getComponent().Method1();

// alternatively do
Foo myCompositeFoo = myComposite.getComponent();
// pass this myCompositeFoo around and do
myCompositeFoo.Method1();

请注意,IComposite 可重用实现包含实际的组合,它实现/提供Foo 接口(interface),您宁愿必须获得通过 getComponent 方法获取它。这是一个小麻烦,但它是必需的,因为在 Java 中没有其他方法可以创建实现任何任意和静态未知接口(interface)的实例(在本例中为 Composite)。我能做的最好的就是给你一个 Composite,它在下面为你构建一个真正的复合组件并返回你想要的接口(interface)类型 Foo。这是使用动态代理实现的,但该实现是类型安全且完全组件化的,即您不必创建任何新的复合数组来实现您的接口(interface)。

关于java - 像处理单个实例一样处理实例数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13743511/

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