我能否在Java中重命名已实现的方法?

3

我有一个类实现了一个接口,其中一个方法叫做onClick。有没有一种方法可以实现接口想要的onClick方法,但是给它起一个不同的名字?就像这样(我举个例子):

public void AnyMethodNameIWant() implements Interface1.onClick

我提出这个问题的三个原因:

  1. 可以通过方法签名知道它来自于一个接口,这样很方便
  2. 避免像 onClick 这样的“通用”名称,这是接口可能要求我的
  3. 区分许多接口中相同的方法名称

如果这是一个基本的问题,我很抱歉,因为我是新手。

5个回答

6
不可以,在Java中,接口必须通过同名方法进行实现。不过,你可以使用 @Override 注解来标注接口实现(从Java 6开始),这有助于澄清该方法不能随意更改名称。
对于第二个问题,可能的一个选项是创建一个专门用于将调用转发到更具体方法的实现类,你可以将其作为嵌套类甚至匿名类。虽然我通常不会这样做。
编辑:看到第三个问题 - 不可以,如果在Java中有两个具有相同方法签名的接口,则只能提供一个实现 :( 如果两个接口具有相同的方法签名但不同的返回类型,则更糟糕。你可以编写一个 Interface1 getInterface1() 方法,它返回一个代理 Interface1 方法到“主”类的匿名内部类实例。

好的,我会接受这个答案。 :) 谢谢大家的回答。我只能选择一个作为答案。 - Mendhak

2

不行。

你唯一能做的就是添加一个实现接口并调用你的方法的阴影方法。

public class MyClass implements Interface1 {
    public void AnyMethodNameIWant() { ...; }
    public void onClick() { AnyMethodNameIWant(); }
}

2

这两个问题通常通过使用适配器模式来解决:

  • 避免像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();
            }
        };
    }
}

基本上,您需要创建一个中间步骤,将所有对任何接口方法的调用转发到真正的实现。命名和签名可能会有所不同。如果您希望(或必须,如果两个接口具有具有不同行为的竞争方法),您还可以为不同的接口提供不同的适配器。有很多可能性如何分发适配器实例 - 在某些情况下每次创建一个新实例可能不明智。当然,这种模式不是您只是为了玩而实现的,也不是为了最小化和清洁的代码而实现的。但它可以解决真正的问题。

1

你不能重命名这个方法,但是你可以定义两个方法(onClickanyMethodNameIWant),并让 onClick 方法简单地调用你的另一个方法。

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

@Mizuki 在这里看一下Shakedown对@Override注解的使用吧 -- 它显示了该方法是在接口或超类中定义的。当您重命名接口中的方法并忘记在所有实现中这样做时,甚至会给您编译器错误提示。 - Philipp Reichart

1
当然,您可以使用不同的名称创建额外的方法,指向相同的实现,以获得所需的命名。
public void interfaceMethodA(){
   // some implementation here
}

public void AnyMethodNameIWant(){
    interfaceMethodA();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接