当前位置: 代码迷 >> java >> Java界面最佳实践
  详细解决方案

Java界面最佳实践

热度:59   发布时间:2023-07-27 09:17:09.0

我有以下两种方式

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中的类型应该是什么?

首先,不要将其命名为Object 是Java所有其他类的隐式基类。 从技术上讲,你能说出你的界面Object ,只要你不把它放在包java.lang ,但是这将是很大的误导性。

要为ObjectAObjectB getId()提供不同的返回类型,请使用泛型:

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

假设你的id总是一个数字。

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

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

调用此代码的代码将不知道Id的实际类型。 但是,他们仍然可以确定它是一个数字,并且可以像调用代码所需的那样调用Number.doubleValue()Number.longValue()类的东西。