【问题标题】:Declaring Interface inside class file in Java在Java中的类文件中声明接口
【发布时间】:2012-08-07 17:22:13
【问题描述】:

在 Objective-C 中,我们可以在同一个头文件中定义协议和实现。 例如:

@class GamePickerViewController;

@protocol GamePickerViewControllerDelegate <NSObject>
  - (void)gamePickerViewController:
    (GamePickerViewController *)controller 
    didSelectGame:(NSString *)game;
@end

@interface GamePickerViewController : UITableViewController

@property (nonatomic, weak) id <GamePickerViewControllerDelegate> delegate;
@property (nonatomic, strong) NSString *game;

@end

这样,如果我包含 .h 文件,我将可以访问文件中定义的协议。 我正在Java中寻找类似的结构,因为我发现它在某些我想避免创建太多文件(接口文件+类文件)的情况下很有用。 这样我就可以声明:

public class MyImplementation implements AnotherClass.MyInterface{
      AnotherClass otherClass;
}

我认为接口内的嵌套类是要走的路。我是对的吗?还是 Java 中没有类似的东西?

【问题讨论】:

  • 为什么要避免创建更多文件? Java 鼓励为每个类和接口定义单独的文件。
  • 我同意 ArtB。此外,无论对错,它都打破了大多数 Java 程序员使用的惯例。未来的程序员会对这种事情感到有些困惑。
  • 其实这是当今Android开发者的普遍模式。看看 Recycler 视图适配器和持有者,他们做的事情类似于这个问题所要求的

标签: java


【解决方案1】:

你可以嵌套类,并且嵌套类是公共静态的,这允许它们在同一个源文件中(虽然不寻常,将它们放在一个包中并使用单独的源文件更正常)

例如这是允许的

public class AnotherClass {

    public static interface MyInterface{
        // Interface code
    }

    public static class MyClass{
        //class code
    }
}

在另一个文件中

public class MyImplementation implements AnotherClass.MyInterface{

}

另一种选择是

public interface MyInterface{
    public static class MyClass implements MyInterface{
    }
}

然后使用 MyInterface.MyClass 访问该类(有关此类结构的示例,请参见 java.awt.geom.Point

【讨论】:

  • 我不同意嵌套类是不寻常的。在我看来,它们一点也不稀奇,我会说基于嵌套类的 Java 习惯用法很常见。例如,Builder 创建设计模式依赖于静态嵌套类,还有许多其他模式。 Joshua Bloch 在 Effective Java 2nd Ed 中专门写了一篇文章来“支持静态嵌套类而不是内部类”。
【解决方案2】:

您可以像这样嵌套类和接口,并让它们公开!但是,您不能实现/扩展类/接口,其中扩展的类嵌套在要扩展的类中

所以这行不通:

class A extends A.B {
    public class B {

    }
}

B 类在其中公开很好,但顶级类不能扩展内部类。

【讨论】:

    【解决方案3】:

    使用嵌套类可以实现类似的功能:将实现与接口一起打包,例如:

    public interface MyInterface
    {
        public class Implementation implements MyInterface
        {
    
        }
    }
    

    现在您拥有MyInterface 和具体实现MyInterface.Implementation

    【讨论】:

    【解决方案4】:

    Java API 经常用类来做这种事情。例如JFormattedTextFiled.AbstractFormatter。请注意,声明包含static 修饰符。我不明白为什么你也不能用接口来做到这一点。

    【讨论】:

      【解决方案5】:

      您可以做的是定义接口,然后将默认实现作为匿名内部类、类静态变量。

      interface AProtocol {
          String foo();
      
          static final AProtocol DEFAULT_IMPLEMENTATION = new AProtocol(){
                  @Override
                  public String foo(){
                      return "bar!";
                  }
              };
      }
      

      你是这个意思吗?

      【讨论】:

        【解决方案6】:
        interface B {
           public void show();
        
           class b implements B {
              public void show() {
                 System.out.println("hello");
              }
           }
        }
        
        class A extends B.b {
           public static void main(String ar[]) {
              B.b ob=new B.b();
              ob.show();
           }
        }
        

        【讨论】:

          猜你喜欢
          • 2018-12-06
          • 1970-01-01
          • 1970-01-01
          • 2018-11-26
          • 1970-01-01
          • 1970-01-01
          • 2014-02-02
          • 1970-01-01
          • 2011-03-23
          相关资源
          最近更新 更多