2015-12-11 4 views
0

В классе сегодня мы говорили о отражении в Java-программировании. Часть урока сегодня заключалась в использовании InvocationHandler s в Java, а не просто в реализации интерфейса. Когда я спросил учителя, в чем преимущества использования обработчика вызова, ответа не было. Так скажем, у нас есть интерфейс плагинJAVA: В чем преимущества InvocationHandler над реализацией интерфейса?

public interface Plugin { 
    void calculate(double a, double b); 
    String getCommand(); 
} 

вы можете легко реализовать этот интерфейс в классе Multiply

public class Multiply implements Plugin { 
    @Override 
    public void calculate(double a, double b){ 
     return a * b; 
    } 

    @Override 
    public String getCommand(){ 
     return "*"; 
    } 
} 

Тогда почему я предпочитаю другую реализацию с использованием InvocationHandler?

public class MyMock { 
    public static Object createMock(Class myClass) { 
     InvocationHandler handler = new MyInvocationHandler(); 
     Object result = Proxy.newProxyInstance(myClass.getClassLoader(), new Class[]{myClass}, handler); 
     return result; 
    } 
} 

Заранее спасибо :)

ответ

2

Proxy является dynamic proxy, а это означает, что она дает большую гибкость при выполнения, тогда как интерфейсы и классы реализации все должно быть решено на compile- время.

Например, предположим, что по какой-либо причине вы хотите переопределить возвращаемые значения в null для определенных вызовов методов в течение ночи. Если вы должны были реализовать статически, вам нужно будет написать логику во все классы с чем-то вроде

if(isNight()) 
    return null; 
return normalValue; 

Однако с Proxy, вы можете написать вышеуказанную логику в InvocationHandler и нормальные классы не будут даже знают, что их ценности не используются ночью. Это также позволяет вам иметь несколько InvocationHandlers, поэтому вы можете запускать свой код с параметрами, чтобы решить, хотите ли вы регистрировать вызовы, запрещать вызовы по соображениям безопасности или любую другую такую ​​вещь, что было бы совершенно невозможно сделать со статическими реализациями.

Приведенный выше пример может быть не кристально чистым, но в основном это проблема дизайна, а не возможность сделать что-то другое, что не может.

+0

спасибо! это сделало это уже намного более ясным! :) – KoenVE