Java модифицирующий класс на лету (добавление нового метода)

1

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

Как можно предоставить отдельный метод/контекст/область для каждого экземпляра класса?

В javascript легко изменить существующий класс. Легко передать анонимную функцию как обратный вызов для любого метода. С ним контекст и масштаб.

Или мне нужно расширить свой пользовательский класс для каждого запроса, если мне нужен другой обратный вызов?

  • 0
    Лямбды часто являются быстрым и простым способом обработки обратных вызовов.
  • 0
    Как смежная тема, похожий подход к генерации классов на лету, который я видел в контексте Java, это EclipseLink MOXy Project.
Теги:

3 ответа

5
Лучший ответ

Вы можете сделать это при создании экземпляра, например:

Whatever w = new Whatever("Something") {
    public void onWhateverDoThis() {
        //...
    }
};

Поэтому, когда я лично использовал его недавно, были методы обратного вызова модального:

ModalManager.show(new Modal("Title", "Text") {
    public void onDismiss() {
        //Do something on dismiss
    }

    public void onConfirm() {
        //Do something on confirm
    }
});
  • 0
    хммм завтра опробую :), наверное я немного опрометчивый ...
  • 0
    Он говорит, что он не может разрешить этот метод ...: \ Может быть, потому что я расширяю AsyncTask, и это относится к нему.
Показать ещё 1 комментарий
1

Java и Javascript - очень разные языки. Вы будете очень расстроены, если попытаетесь применить к одной парадигме программирования, которая работает в другой. Я тоже очень расстроился Javascript в начале, исходя из Java, пока не понял фундаментальные различия между динамическими и статическими языками.

В этом конкретном случае я не считаю целесообразным продлить ваш класс каждый раз, когда вам нужно использовать другой обратный вызов, поскольку это приведет к большому числу подклассов. Если вам нужно много объектов, которые отличаются только конкретным аспектом, не лучше ли иметь класс или интерфейс, которые представляют этот конкретный аспект?

Возможным решением (но не единственным правильным) любыми способами было бы использовать шаблон стратегии: определить интерфейс, представляющий обратный вызов, и реализовать интерфейс для каждого разного обратного вызова, который вам нужен. Вы можете передать эти обратные вызовы как параметры так же, как и в Javascript, за исключением того, что эти обратные вызовы не смогут получить доступ к любому непубличному члену класса, который их вызывает.

Также не забудьте взглянуть на библиотеку Apache Commons Functor, которая по существу связана с объектами, представляющими функции. Я никогда не использовал его, но, будучи Apache Commons, это было бы моей первой остановкой, если бы у меня были ваши требования.

  • 0
    Ну, мне нужно вызвать метод Android Activity после завершения запроса. Я хочу создать модель и статические методы, делать запросы с разными параметрами и вызывать обратный вызов, когда запрос завершен. Я создал отдельные классы. WebRequest и WebResponse. Переопределение метода обратного вызова WebResponse и передача экземпляра WebResponse в WebRequest. Вызов метода обратного вызова, когда запрос завершен. Не уверен, но это звучит разумно для меня ... Может быть, я ошибаюсь.
0

Вы можете легко расстроиться, потому что классическая нефункциональная Java не предназначена для тех целей времени выполнения, о которых вы упоминали.

Но действительно, вы можете реализовать обратный вызов в java, используя такой интерфейс:

Ссылка: CALLBACK PATTERN IN JAVA ENVIRONMENT

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

Вы можете определить такой интерфейс:

public interface SomeEvent{
    // A regular method, it can return something or take arguments
    public void someEventMethod();
}

Затем определите класс, который будет сигнализировать/уведомлять событие, ему нужно ожидать объекты, реализующие интерфейс SomeEvent, а затем, при необходимости, вызывать метод someEventMethod().

public class EventNotifier{
    private SomeEvent se;
    private boolean somethingHappened; 
    public EventNotifier (SomeEvent event){
         //Save the event object for later use.
         se = event; 
         // Nothing to report yet.
         somethingHappened = false;
    } 
    //...  
    public void doWork (){
        //Check the predicate, which is set elsewhere.
        if (somethingHappened){
             //Signal the even by invoking the interface method
             se.someEventMethod();
        }
        //...
    } 
    // ...
}

Наконец, напишите какой-то код, который ожидает получения уведомления о событии, он должен реализовать интерфейс SomeEvent и просто передать ссылку на него уведомлению события, например:

public class CallMe implements SomeEvent{
    private EventNotifier en; 

    public CallMe (){
         //Create the event notifier and pass itself to it.
         en = new EventNotifier (this);
    } 

    //Define the actual handler for the event
    public void someEventMethod(){
         // Some event interesting must have occurred
         // Do something...
    } 
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню