繁体   English   中英

没有泛型的代码重用

[英]Code reuse without generics

假设我需要创建3个链接列表,一个用于int,一个用于Strings,一个用于其他类型的自定义对象。 如果我使用的是泛型,只需创建一个链接列表即可轻松实现,但是如果我不使用泛型,是否可以避免3次编写相同的重复代码?

如果您使用Integer而不是int ,那么可以。 在这种情况下,所有三个对象都是Object子类,因此您的Linked List类只能处理Object

该代码大致如下所示:

class MyLinkedList{
    public void add(Object){...}
    public Object remove(Object){...}
    ...
}

在Java 1.5中引入泛型之前,Collections都使用Object类型,因此您将拥有一个Objects链表。 然后,您必须确保自己要添加,检索和转换正确的类型。

我看不到为什么不应该或不应该使用泛型的任何原因,因为不再需要或不建议使用Java 1.4。

您不能对ints vs Strings使用相同的代码,但是假设您的意思是Integers,则必须创建一个存储java.lang.Objects的LinkedList,顺便说一句,这是基于通用的LinkedLists所做的。

您可以将链表处理的类型抽象为您自己的类型,例如StringOrIntOrCustom ,该类型具有每种类型之一,并带有一个标志,该标志指定要使用的有效类型。 但是,您需要进行大量检查,以确保您没有在每次使用此数据类型时都执行该类型不支持的操作。

您可以在没有泛型的情况下完成此操作,但是您将无需进行编译时类型安全检查,而必须手动添加所有类型转换。

但是话又说回来,您将基本上执行使用泛型时编译器的工作。 现在,它只是容易出错和手动的。

是的,您可以做到,而且并不难。

abstract class ListNode {
   public ListNode next_;
};

interface ListNodeFactory {
   public ListNode createListNode();
}

然后,您创建一个操作ListNode对象的List类。 当需要一个新的ListNode时,它将调用一个函数来创建一个新的ListNode。 add方法将使用ListNodeFactory参数。 我建议大多数方法都应protected因为不是派生类的任何客户端都不可能使用它。

您将为每种类型从List创建一个派生类。 您将必须使用一种采用所需类型的方法来包装每个方法。 您还必须创建一个ListNodeFactory实现,该实现将创建具有适当类型的新列表节点。 为了获取数据,它还必须将从遍历或删除中获取的ListNode对象转换为适当的类型。 这是一个例子:

class IntListNode extends ListNode {
   public int data_;
   public IntListNode(int x) {
      data_ = x;
   }
}

class IntListNodeFactory implements ListNodeFactory {
   IntListNodeFactory() {
       nextdataset_ = false;
   }
   IntListNodeFactory(int x) {
       nextdataset_ = true;
       data_ = x;
   }
   void setNextData(int x) {
       nextdataset_ = true;
       nextdata_ = x;
   }
   public ListNode createListNode() {
       if (!nextdataset_) {
          throw Exception("Tried to create a node with no data!");
       } else {
          ListNode result = new IntListNode(data_);
          nextdataset_ = false;
          return result;
       }
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM