【发布时间】:2012-11-24 11:25:14
【问题描述】:
在 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)。
在最坏的情况下,我必须为我需要处理的每种类型编写一个单独的类来实现这一点,可能使用接口来描述适用于单个实例和实例数组的功能。
是否有任何 Java 魔法、设计模式或通用拼图游戏可以优雅地实现这一目标?
此外,如果没有,是否有任何语言在本质上促进了这一点?
我很欣赏它并不适用于所有场景,但我想这是由程序员自行决定的。
非常感谢
【问题讨论】:
-
这些策略直接属于functional programming。例如,您可以轻松地像
array.each(function(item){ item.method() }那样做 - 但不是在 Java afaik 中。 -
在 JVM 上运行的 groovy 使用特殊运算符支持这一点。我想不出一种在 Java 中为泛型类而不使用反射的方法。我不确定是否有一种方法可以在运行时以与 groovy/grails 类似的方式注入方法。
-
Scala 也使用这种编程风格。
-
我本质上是函数式编程的爱好者,所以我想命令式语言本质上会做同样的事情是一厢情愿的想法。刚刚过去的学年,我在 Scala 中为我的硕士项目编写了一个编译器。您指的是@PhiLho的地图功能吗?
标签: java design-patterns syntactic-sugar