是否有Java等效于C ++函数指针?

时间:2010-09-02 20:56:00

标签: java

  

可能重复:
  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做这件事吗?

4 个答案:

答案 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个匿名类文件。我不知道它是否会影响性能。所以你最好确保它在实施之前。

对于像你这样的情况,我宁愿选择Andreas'sMikes's解决方案。