Avatar billede jakoba Nybegynder
03. marts 2002 - 23:54 Der er 6 kommentarer og
1 løsning

Forstår du clone() ?

Jeg sidder og roder med clone() for et Java objekt.

Jeg kan få det til at virke, men det jeg er kommet frem til et ulogisk, uskønt og klumpet. Der må være noget jeg mangler i forståelsen.

Her er klassen:

class Film implements Cloneable {

  private String titel;
 
  public Film ( String filmTitel ) {
      titel = filmTitel;
  } // end Film constructor
 
  public String toString( ) {
      return titel;
  } // end toString
 
  public int compareTo ( Film op2 ) {
      return this.toString().compareTo( op2.toString() );
  } // end compareTo
 
  public Object clone ( ) {
      Object temp = null;
      try {
        temp = super.clone();
      } catch ( CloneNotSupportedException e ) { ; }
      return temp;
  } // end clone
     
} // endclass Film

1: Hvorfor kræves der en try/catch når klassen netop er defineret som cloneable.

2: Hvorfor bliver variablen 'titel' kopieret når det er ancestorklassens clone funktion der reelt benyttes.

3: Hvorfor kan jeg ikke få min funktion clone til at returnere et objekt at typen Film som jo er den klasse der clones?

mvh JakobA
Avatar billede disky Nybegynder
04. marts 2002 - 00:03 #1
hejsa

#3 jeg mener det skyldes at det er super klassen du kalder istedet for reelt at lave et kopi.

prøv med noget i retningen af:

public Object clone()
{
  Film film=new Film(titel);
  return film;
}

Kig evt her:
http://www.ergoit.co.uk/ObjCopy/WhatWhy.html
http://www.webtechniques.com/archives/1997/04/java/
http://www.artima.com/objectsandjava/webuscript/ClonCollInner1.html


Eller der hvor jeg fandt de sider:
http://www.google.com/search?q=cloning+of+java+objects&hl=da&lr=


dit spørgsmål #1 besvares is api'en:
The method clone for class Object performs a specific cloning operation. First, if the class of this object does not implement the interface Cloneable, then a CloneNotSupportedException is thrown.


her er resten af api spec'en:
Creates and returns a copy of this object. The precise meaning of "copy" may depend on the class of the object. The general intent is that, for any object x, the expression:
x.clone() != xwill be true, and that the expression:
x.clone().getClass() == x.getClass()will be true, but these are not absolute requirements. While it is typically the case that:
x.clone().equals(x)will be true, this is not an absolute requirement.
By convention, the returned object should be obtained by calling super.clone. If a class and all of its superclasses (except Object) obey this convention, it will be the case that x.clone().getClass() == x.getClass().

By convention, the object returned by this method should be independent of this object (which is being cloned). To achieve this independence, it may be necessary to modify one or more fields of the object returned by super.clone before returning it. Typically, this means copying any mutable objects that comprise the internal "deep structure" of the object being cloned and replacing the references to these objects with references to the copies. If a class contains only primitive fields or references to immutable objects, then it is usually the case that no fields in the object returned by super.clone need to be modified.

The method clone for class Object performs a specific cloning operation. First, if the class of this object does not implement the interface Cloneable, then a CloneNotSupportedException is thrown. Note that all arrays are considered to implement the interface Cloneable. Otherwise, this method creates a new instance of the class of this object and initializes all its fields with exactly the contents of the corresponding fields of this object, as if by assignment; the contents of the fields are not themselves cloned. Thus, this method performs a "shallow copy" of this object, not a "deep copy" operation.

The class Object does not itself implement the interface Cloneable, so calling the clone method on an object whose class is Object will result in throwing an exception at run time.
Avatar billede jakoba Nybegynder
04. marts 2002 - 00:39 #2
disky >>
  Ja det er også min umiddelbare tilskyndelse. At erklære java's indbyggede clone funktion for ulogisk og ubrugelig og så istedet implementere min egen.
  Men man skal være pokkers sikker på sig selv før man skrotter noget standard. Så sikker er jeg ikke endnu.
Avatar billede jakoba Nybegynder
04. marts 2002 - 03:43 #3
Med polymorfisme giver det pludslig mere mening. clone() BEHØVER ikke at returnere andet end type Objekt for det er alligevel de overloadede navne i subklasserne der vil blive brugt. (når jeg caster den alligevel er det for at sikre løftet om de metoder (toString og compareTo) som subklasserne skal indeholde.)

Og idet super.clone reelt kloner den aktuelle subklasse kan den rykkes op i superklassen ListeData, det er jo dejligt.

Men det føles stadig fjollet at skulle lave try/catch samtidig med at skulle lave klassen cloneable.

disky >> Undskyld jeg forklarer dig java, men jeg har brug for at formulere det. (og hvis jeg går i skoven ville det være rart med rettelse).


  class ListeElement {
 
      ListeData indhold;             
      ListeElement prev = null;
      ListeElement next = null;
 
      public ListeElement( ) {
        indhold = new ListeData();
      } // end ListeElement constructor
 
      public ListeElement( ListeData dataObj ) {
        indhold = (ListeData)dataObj.clone();
      } // end ListeElement constructor
 
  } //endclass ListeElement



class ListeData implements Cloneable { 

  public String toString( ) { return ""; }  // end toString
 
  public int compareTo ( ListeData op2 ) {
      return this.toString().compareTo( op2.toString() );
  } // end compareTo
 
  public Object clone( ) {
      try {
        return super.clone();
      } catch ( CloneNotSupportedException e ) { ; }
      return null;
  } // end clone
 
} // endclass ListeData



class Film extends ListeData {
 
  private String titel = "";
 
  public Film ( String filmTitel ) {
      titel = filmTitel;
  } // end Film constructor
 
  public String toString( ) {
      return "film: "+titel;
  } // end toString
 
} // endclass Film



class DVD extends ListeData {
 
  private String navn = "";
  private int udgivelsesAar = 0;
 
  public DVD ( String DVDNavn, int aar ) {
      navn = DVDNavn;
      udgivelsesAar = aar;
  } // end DVD constructor
 
  public String toString( ) {
      return "DVD: " +navn +" " +udgivelsesAar;
  } // end toString
 
} // endclass DVD

mvh JakobA
Avatar billede carstenknudsen Nybegynder
04. marts 2002 - 09:43 #4
En lille kommentar til jakobas kommentar:
"Men det føles stadig fjollet at skulle lave try/catch
samtidig med at skulle lave klassen cloneable."
Det har du heller ikke nødvendigvis brug for, men
da du benytter superklassens clone skal du gøre det.
Hvis du kan klone din egen klasse uden brug af
super.clone() er der ingen problemer. Du har jo
ingen information om hvorvidt superklassen implementerer
kloning.
Avatar billede jesper2009 Nybegynder
04. marts 2002 - 12:27 #5
Der er i APIen under Object klassen, mener jeg, en lille tutorial om clone som er værd at læse.
Avatar billede jakoba Nybegynder
05. marts 2002 - 17:35 #6
Tak for hjælpen. især ham på artima var super.

mvh JakobA
Avatar billede disky Nybegynder
05. marts 2002 - 18:32 #7
disky >> Undskyld jeg forklarer dig java, men jeg har brug for at formulere det. (og hvis jeg går i skoven ville det være rart med rettelse).


bare rolig jeg tolkede det skam ikke som om du forklarede java til mig.
Og hvis jeg gjorde betyder det intet, man kan altid lære :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester