Java界面最佳实践

时间:2015-07-16 13:07:50

标签: java interface

我有以下两种方式

public class ObjectA {
 int id ;
 String name;
}

 public class objectB {
  Long id;
  String name;
 }

我希望能够创建一个将由这两个对象实现的接口'AnObject'。这个界面怎么样?

public interface AnObject {
  public <type?> getId() ;
  public String getName();
}

ID的getter类型应该是什么?

2 个答案:

答案 0 :(得分:18)

首先,不要将其命名为ObjectObject是Java的所有其他类的隐式基类。从技术上讲,只要您不将其放在包Object中,就可以将界面命名为java.lang,但这会产生很大的误导性。

要为getId()ObjectA中的ObjectB提供不同的报表类型,请使用泛型:

public interface MyObject<T> {
  T getId();
  String getName();
}

public class ObjectA implements MyObject<Integer> {
  @Override
  public Integer getId() {
    return 0;
  }

  @Override
  public String getName() {
    return "A";
  }
}

public class ObjectB implements MyObject<Long> {
  @Override
  public Long getId() {
    return 0;
  }

  @Override
  public String getName() {
    return "B";
  }
}

如果getId()始终返回一个数字,您还可以将MyObject定义为MyObject<T extends Number>。请注意,您不能将本机类型intlong与泛型一起使用;您必须使用带框的类型IntegerLong

答案 1 :(得分:0)

假设您的ID始终是一个数字。

如果您的getter getId()的用户没有(或不应该)关心返回值的实际类型,您也可以直接使用Number,而不使用泛型。如果您想使用泛型,这取决于上下文。在这种情况下,使用泛型的一个优点是您不必定义id的实际类型,这使得调用代码与MyObject的实现更少耦合。

public interface AnObject {
    public Number getId() ;
    public String getName();
}

调用它的代码不会知道Id的实际类型。但是,他们仍然可以确定它是一个数字,可以像调用代码一样调用Number.doubleValue()Number.longValue()之类的内容。