Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4673424

Programming to interfaces when using clone()

XMLWordPrintable

    • Icon: Enhancement Enhancement
    • Resolution: Won't Fix
    • Icon: P4 P4
    • None
    • 1.4.0
    • core-libs
    • x86
    • windows_2000



      Name: nt126004 Date: 04/23/2002


      FULL PRODUCT VERSION :
      java version "1.4.0"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-b92)
      Java HotSpot(TM) Client VM (build 1.4.0-b92, mixed mode)

      A DESCRIPTION OF THE PROBLEM :
      I've run in to this before, and it's really annoying me. I
      found some threads on Usenet from people with simlar issues,
      and I think it's time to fix it.

      The problem is this: it is bad design that the language
      doesn't include some way of knowing that an object has a
      public clone() method. I've see people complaining of the
      issue with Shape. I'm very currently dealing with it with
      Collection and Set.

      Now, I agree that there are good reasons for having clone()
      be protected, and even good reasons for not having Cloneable
      include a public clone method. HOWEVER, it is also very
      true that you should NOT have to deal with specific
      implementations of interfaces in order to know that it has a
      public clone method.

      Let us take Set, for example. It doesn't have a public
      clone method. That's fine, it makes sense. Maybe you have
      a multi-tiered Set that is storing its data elsewhere where
      clone() would be difficult (or some other esoteric reason).
       However, if I am using Sets, and I want to create a copy, I
      shouldn't have as my only two options to create, say, a
      HashSet with the Collection-arg constructor; or, to test to
      see if the set is one which I already know has a public
      clone so I can use it. Why? The constructor that takes a
      Collection is inefficient. And maybe the method I'm writing
      will get passed yet another implementation of Set that also
      has an efficient clone method, but that I wasn't expecting
      when I wrote the method.

      Solution? The next version of the API should include this
      interface:

      public interface PublicCloneable extends Cloneable
      {
        public Object clone();
      }

      And *every* *single* class in the java. javax. hierarchies
      that has a public clone() method should implement that
      interface. Then, at least, we could use the (often more
      efficient) clone methods when they apply and we could have
      some test to find out when they *do* apply, and we could
      still program to interfaces instead of having to face the
      bad choice between breaking our model or being inefficient.
       This shouldn't cause any problems with any of the existing
      code-base out there either. It should be VERY easy to
      change the language to work in this manner.

      This bug can be reproduced always.
      (Review ID: 145430)
      ======================================================================

            darcy Joe Darcy
            nthompsosunw Nathanael Thompson (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: