可能重复:
What's the nearest substitute for a function pointer in Java?
我正在编写一个工厂类来创建一堆不同的小部件。为了论证,假设这个工厂可以创建1000个小部件。
myWidget createWidget (widgetId)
{
case 0: createwidget0 ();
.
.
case 1000: createwidget1000 ();
}
我不想写1000个案例陈述。我想把所有的创建例程 在数组中。使用widgetId作为索引直接执行create例程 它不必经过比较1000条件。所以整个createWidget 例程可以像这样简化
myWidget createWidget (widgetId)
{
myAwsomeFuncArr createFunc;
myWidget widget = createFunc[widgetId] ();
}
用Java做这件事吗?
答案 0 :(得分:8)
实现小部件工厂并将它们存储在大型数组中。那将非常接近:
public interface WidgetFactory {
public Widget create();
}
以及其他地方:
public class MyClass {
private static Widgetfactory[] widgetFactories = new WidgetFactory[1000];
static {
widgetFactories[0] = new FancyButtonFactory(); // FancyButtonFactory implements WidgetFactory
widgetFactories[1] = new FancyTextFieldFactory(); // see above
// ...
}
static public Widget createWidget(int index) {
return widgetFactories[index].create();
}
}
这段代码只是为了显示没有函数指针的类似方法而编写的。真实应用程序将使用(更好)更好的设计。
答案 1 :(得分:7)
我非常喜欢使用Java枚举来完成这类任务。 一个干净的解决方案,嘿,键入安全!
public abstract class Widget {
protected boolean loaded;
public Widget() {
loaded = false;
}
}
public class ConcreteWidgetA extends Widget {
public ConcreteWidgetA() {
super();
}
public void doSomething() {
if (!loaded) {
load();
loaded = true;
}
}
private void load() {
}
}
public class ConcreteWidgetB extends Widget {
public ConcreteWidgetB() {
super();
}
public void doSomethingElse() {
if (!loaded) {
load();
load = true;
}
}
private void load() {
}
}
public enum Widgets {
CONCRETE_WIDGET_A(new ConcreteWidgetA()),
CONCRETE_WIDGET_B(new ConcreteWidgetB());
private Widget widget;
public Widgets(Widget aWidget) {
widget = aWidget;
}
public Widget getWidget() {
return widget;
}
}
public class WidgetFactory {
//Here's the money maker.
public static Widget createWidget(Widgets aWidgetElement) {
return aWidgetElement.getWidget();
}
}
答案 2 :(得分:5)
Java中函数指针的等价物是function object或仿函数。
答案 3 :(得分:1)
示例函数:
public class Functor {
interface func{
int fun(int x,int y);
String toString();
}
public static void main(String[] args) {
func add=new func(){
public int fun(int x, int y) {
return x+y;
}
public String toString() {
return "+";
}
};
func mult=new func(){
public int fun(int x, int y) {
return x*y;
}
public String toString() {
return "*";
}
};
func[] arr={add,mult};
int i[]={10,20,30,40};
for(int val:i)
for(func f:arr)
System.out.println(val+""+f+val+"="+f.fun(val,val));
}
}
注意:如果你为1000个小部件执行类似的操作,那么你将制作1000个匿名类文件。我不知道它是否会影响性能。所以你最好确保它在实施之前。