【问题标题】:Java, macro code, function addressJava,宏代码,函数地址
【发布时间】:2011-03-01 16:19:16
【问题描述】:

我是Java初学者,我想写一些这样的代码:

TEST(myfunction(1, 2, 3));

TEST 是:

  • C 中使用的宏
  • 需要函数地址的函数 myfunction

在我的代码中,我希望 TEST 做一些代码:

TEST(function) {
    if (function()) 
        // code
    else
        //code
}

我知道指针在 Java 中不可用。 有什么想法可以帮助我吗?

[编辑] 这是另一个例子:

TEST(myfunction(1, 2, 3));

执行测试的地方:

void TEST (function(args[])) {
try {
    function();
}
catch (Exception e) {
    // Exception happened !
}

}

多亏了这一点,只需要一行代码,我就可以使用 try catch 了!

【问题讨论】:

  • 看起来它可以简单地替换为具有单个布尔参数的函数定义...如:public boolean test(boolean b) { ... }...
  • @perp 不,我不能将布尔值作为参数传递。我需要调用 TEST 中的函数来执行它并使用返回值进行一些处理
  • with only one code line, I will be able to use try catch !。请不要这样做。在 Java 中你使用异常,如果你不想要它们,那么就不要使用 Java。
  • @Ishtar 我从来没有说过我不想使用异常!我只想在一行中写几行。我在 C 中使用宏很容易做到这一点,我尝试在 Java 中做同样的事情
  • 实际上,当您遇到异常时,它是异常的,您不想像什么都没发生一样继续,(这似乎是假设)

标签: java function macros


【解决方案1】:

Java 没有指向函数的指针。在 Java 中传递函数的典型方式是传递一个实现 Runnable 的对象。

编辑:我已经修改了我的示例以更接近您的第二种情况。

在您需要布尔返回值的情况下,您可以定义自己的接口:

public interface BooleanTest {
    boolean test(Object... args) throws Exception;
}

然后:

class MyTest implements BooleanTest {
    private boolean result;
    public MyTest(int a, int b, int c) {
        result = a + b == c;
    }
    // stupid test -- don't _have_ to declare "throws Exception"
    public boolean test(Object... args) {
        return result && args.length == 3;
    }
}

TEST(new MyTest(1, 2, 3));

在测试内部:

TEST(BooleanTest test) {
    try {
        if (test.test("Jack", "and", "Jill")) {
            // ...
        }
    } catch (Exception e) {
    }
}

【讨论】:

  • 如果你想让你的答案更清楚,你至少应该解释一下为什么 OP 的解决方案在 Java 中不起作用。
  • @Ted Hopp 抱歉,新线程中的 Runnable 调用函数,这里我想在当前线程中执行
  • @TheFrancisOne Runnable 可用于创建新的 Thread 对象,但这不是它的唯一用途。 Runnable 本身不会创建新线程;它只是一个带有 run() 方法的对象,它声明自己是一个 Runnable。
  • 在这种情况下,如果你想返回一些东西,Callable<Boolean> 似乎是比Runnable 更好的选择。
  • @Ted Hopp 谢谢,但对我来说还不够。在这里,您的 TEST 函数将对象作为参数 TEST(BooleanTest test) 并在调用正确的方法之后。但在我的情况下,我不知道执行什么方法,我的TEST函数必须使用这个方法作为参数。
【解决方案2】:

你需要获取一个接口实现作为参数。像这样:

public static void testFunction(new FunctionContainer() {

  @Override
  public int function() {
    ...
  }

};);

【讨论】:

  • 界面不是我想要的。因为这里我要执行方法(或函数)并做一些处理
【解决方案3】:

你不能在 java 中真正做到这一点,因为方法不是对象。为了实现您想要的功能,您需要将您的函数/方法包装在另一个对象中。

 // Define a function interface that your test method takes as an argument.
 public interface Function {
     public abstract void doFunction();
 }

 // Test code
 public void test(Function function) {
     function.doFunction();
 }

 // You can then pass an implementation of Function to your test method
 test(new Function() {
     public void doFunction() {
         // Function implementation
     }
  });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2023-03-21
    • 2014-01-22
    • 1970-01-01
    • 2012-02-05
    • 2012-02-15
    • 1970-01-01
    相关资源
    最近更新 更多