Java, код макроса, адрес функции - PullRequest
2 голосов
/ 01 марта 2011

Я новичок в Java, и я хотел бы написать такой код:

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

Где ТЕСТ :

  • Либо макрос, используемый в C
  • Либо функция, для которой нужен адрес функции myfunction

В моем коде я бы хотел, чтобы TEST сделал некоторый код:

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

Я знаю, что указатели не могут использоваться в Java. Идея помочь мне?

[EDIT] Вот еще один пример:

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

Где выполняется ТЕСТ:

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

}

Благодаря этому, имея только одну строку кода, я смогу использовать try catch !

Ответы [ 3 ]

5 голосов
/ 01 марта 2011

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:

TEST(BooleanTest test) {
    try {
        if (test.test("Jack", "and", "Jill")) {
            // ...
        }
    } catch (Exception e) {
    }
}
0 голосов
/ 01 марта 2011

Вы не можете сделать это в 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
     }
  });
0 голосов
/ 01 марта 2011

Вам необходимо получить реализацию интерфейса в качестве параметра.Как это:

public static void testFunction(new FunctionContainer() {

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

};);
...