【问题标题】:Can I rename an implemented method in Java?我可以在 Java 中重命名已实现的方法吗?
【发布时间】:2011-11-28 23:58:50
【问题描述】:

我有一个实现接口的类,其中一个方法称为 onClick。有没有办法实现接口想要的 onClick 但将其命名为其他名称?类似的东西(我正在编造这个):

public void AnyMethodNameIWant() implements Interface1.onClick

我要问的三个原因是:

  1. 如果查看方法签名并知道它是 来自接口
  2. 为了避免像 onClick 这样的“通用”名称,界面可能需要我拥有
  3. 在许多接口中区分相同的方法名称

如果这是一个根本“糟糕”的问题,我深表歉意,因为我是 Java 新手。

【问题讨论】:

    标签: java interface rename explicit


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 好吧,我会接受的。 :) 谢谢大家的回答。我只能将一个标记为答案。
    【解决方案2】:

    没有。

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

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

    【讨论】:

      【解决方案3】:

      您不能重命名该方法,但您可以定义这两个方法(onClickanyMethodNameIWant)并让 onClick 只需调用其他方法即可。

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

      【讨论】:

      • @Mizuki 在此处查看 Shakedown 对 @Override 注释的使用 -- ut 显示该方法是在接口或超类中定义的。当您重命名接口中的方法并且忘记对所有实现这样做时,这甚至会给您带来编译器错误。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        这两点

        • 为了避免像 onClick 这样的“通用”名称,界面可能需要我拥有
        • 在许多接口中区分相同的方法名称

        通常使用Adapter Pattern来解决。

        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();
                    }
                };
            }
        }
        

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-05
          • 1970-01-01
          • 2021-05-25
          相关资源
          最近更新 更多