繁体   English   中英

我可以在Java中重命名已实现的方法吗?

[英]Can I rename an implemented method in Java?

我有一个实现接口的类,其中一个方法叫做onClick。 有没有办法实现接口想要的onClick,但是将其命名为其他东西? 像(我正在做的):

public void AnyMethodNameIWant() implements Interface1.onClick

我问的三个原因是:

  1. 看一下方法签名并知道它来自一个接口会很好
  2. 要避免像onClick这样的“通用”名称,接口可能需要我拥有
  3. 在许多接口中区分相同的方法名称

如果这是一个基本上“坏”的问题,我很抱歉,因为我不熟悉Java。

不,你不能。 接口必须通过Java中的同名方法实现。

您可以将@Override注释与接口实现一起使用(从Java 6开始),这有助于澄清这是一种不能随意重命名的方法。

第二个问题的一个选项可能是创建一个实现类, 只是为了转发对更具体方法的调用。 您可能希望将此作为嵌套甚至匿名类。 我不确定我通常会这样做。

编辑:看过第三个问题 - 不,如果你在Java中有两个具有相同方法签名的接口,你只能提供一个实现:(哦,如果你有两个具有相同签名但不同返回类型的接口,更糟糕的是。你总是可以编写一个Interface1 getInterface1()方法,该方法将一个匿名内部类的实例返回到“main”类,代理Interface1方法。

不。

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

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

那两点

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

基本上,您创建了一个中间步骤,将对任何接口方法的所有调用转发到实际实现。

命名和签名可能有所不同。 如果需要,您还可以为不同的接口提供不同的适配器(或者如果两个接口都具有不同行为的竞争方法,则必须提供)。

如何分发适配器实例有很多可能性 - 在某些情况下每次创建一个新实例可能并不明智。

当然,这种模式并不是为了娱乐或仅为了最小和干净的代码而实现的。 但它可以解决实际问题。

您无法重命名该方法,但您可以定义这两种方法( onClickanyMethodNameIWant )并让onClick只是简单地调用您的其他方法。

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

您当然可以使用具有不同名称的其他方法,这些方法指向相同的实现以获得您想要的命名。

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

public void AnyMethodNameIWant(){
    interfaceMethodA();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM