Java中的泛型或继承/接口?

时间:2017-06-10 02:46:51

标签: java generics

class Product<T>{
   String name;

   T category;
}

与下面的设计相比,哪一个更好,如何在不同的情况下选择哪一个?我认为它们在功能方面是相同或非常相似的。

class Product{
  String name;
  Category category;
}

interface Category {
   String type();
}

class C1 implements Category{
    ...
   @Override
   String type(){
      ...   
   }
}

class C2 implements Category{
    ...
   @Override
   String type(){
      ...   
   }
}

1 个答案:

答案 0 :(得分:1)

你能做到的第三种方式,我个人会选择:

interface Product
{
    public String getName();
    public String getCategory();
}

class Shirt implements Product
{
    @Override
    public String getName()
    {
        return "Shirt";
    }

    @Override
    public String getCategory()
    {
        return "Clothing";
    }
}

我建议这样做的原因是你可能会有不同类型的产品,例如:衬衫,牛仔裤,内衣,一瓶牛奶。这些可能与is aProduct的关系,即衬衫是产品,一瓶牛奶是产品。这表明Shirt将从某个基类Product类继承:

class Product
{
    String name;
    String category;
}

或者,它将实现Product接口:

interface Product
{
    public String getName();
    public String getCategory();
}

这两种方式都有效,我更喜欢界面,因为它不会限制你到单亲。现在,每件产品都可以具有更多特定属性 - 例如,衬衫将具有一定的尺寸,而一瓶牛奶将具有一定的体积:

class MilkBottle implements Product
{
    int volume;

    @Override
    public String getName()
    {
        return "Milk (" + volume + "ml)";
    }

    @Override
    public String getCategory()
    {
        return "Grocery";
    }
}
  

哪一个更好,如何选择在不同情况下?

在编码方面,证明一种解决方案比另一种解决方案更好是非常困难的,如果不是不可能的话。这是一个你必须做出的判断,并且随着经验你会变得更好。话虽这么说,你应该经常考虑两件事:

  • 这个解决方案使用起来有多容易?
  • 维护此解决方案有多容易?

开始实施您的解决方案的小型模型,并亲自了解您认为哪个更好。实例化产品是否容易?或者对课程进行单元测试? 3个月后,当您决定添加新产品时呢?

我希望将来能帮到你。