Java接口最佳实践

8
我有两个对象,如下所示。
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个回答

18
首先,不要将其命名为ObjectObject是Java中所有其他类的隐式基类。从技术上讲,只要不将其放置在java.lang包中,您可以将接口命名为Object,但这将极易引起误解。
要为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

1
谢谢Robin,非常有用。关键字“Object”只是举例而已。 - user_mda
3
我们可以通过添加public interface MyObject<T extends Number> 来改进这个解决方案,因为我们期望类型 T 是一个数字。 - Piotr Wittchen
@piotr.wittchen 你说得对;看一下我回答的最后一段。;) - Robin Krahl
我明白了。我可能错过了。 :) - Piotr Wittchen

0

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

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

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

调用此代码的代码将不知道Id的实际类型。但他们仍然可以确定它是一个数字,并且可以调用像Number.doubleValue()Number.longValue()这样的方法,以满足调用代码的要求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接