Могу ли я переименовать реализованный метод в Java? - PullRequest
3 голосов
/ 01 октября 2011

У меня есть класс, который реализует интерфейс, и один из методов называется onClick.Есть ли способ реализовать onClick, который хочет интерфейс, но назвать его как-нибудь еще?Что-то вроде (и я это придумываю):

public void AnyMethodNameIWant() implements Interface1.onClick

Я спрашиваю три причины:

  1. Было бы неплохо взглянуть на сигнатуру метода и узнать,что это происходит из интерфейса
  2. Чтобы избежать «общих» имен, таких как onClick, интерфейс может потребовать, чтобы у меня было
  3. Чтобы различать одни и те же имена методов во многих интерфейсах

Извиняюсь, если это принципиально «плохой» вопрос, поскольку я новичок в Java.

Ответы [ 5 ]

6 голосов
/ 01 октября 2011

Нет, вы не можете. Интерфейсы имеют , которые должны быть реализованы одноименным методом в Java.

Вы можете использовать аннотацию @Override с реализациями интерфейса (начиная с Java 6), что помогает уточнить, что это метод, который нельзя просто произвольно переименовать.

Один вариант для вашей второй проблемы может заключаться в создании класса реализации просто с целью переадресации вызова более конкретному методу. Возможно, вы захотите сделать это как вложенный или даже анонимный класс. Я не уверен, что я бы обычно делал бы это все же.

РЕДАКТИРОВАТЬ: увидев третий вопрос - нет, если у вас есть два интерфейса с одинаковой сигнатурой метода в Java, вы можете предоставить только одну реализацию :( О, и если у вас есть два интерфейса с одной и той же сигнатурой, но разной возвращайте типы, это еще хуже. Вы всегда можете написать метод Interface1 getInterface1(), который возвращает экземпляр анонимного внутреннего класса, передающий методы Interface1 в "основной" класс.

2 голосов
/ 01 октября 2011

Эти две точки

  • Чтобы избежать «общих» имен, таких как onClick, интерфейс может потребовать, чтобы у меня было
  • Чтобы различать одни и те же имена методов во многих интерфейсах

обычно решается с помощью шаблона адаптера .

interface IFoo {
    void onClick();
    void onChange();
}

class MyImpl {
    void doSomething(){
        // real code for onClick 
    }
    void doSomethingElse(){
        // real code for onChange
    }

    IFoo getFooAdapter(){
        return new IFoo() {
            @Override
            public void onClick() {
                doSomething();
            }

            @Override
            public void onChange() {
                doSomethingElse();
            }
        };
    }
}

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

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

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

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

2 голосов
/ 01 октября 2011

Нет.

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

public class MyClass implements Interface1 {
    public void AnyMethodNameIWant() { ...; }
    public void onClick() { AnyMethodNameIWant(); }
}
1 голос
/ 01 октября 2011

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

public void interfaceMethodA(){
   // some implementation here
}

public void AnyMethodNameIWant(){
    interfaceMethodA();
}
1 голос
/ 01 октября 2011

Вы не можете переименовать метод, но вы можете определить оба метода (onClick и anyMethodNameIWant), и onClick просто вызовет другой метод.

@Override
public void onClick() {
    anyOtherMethodNameIWant();
}
...