Avatar billede martinbk Nybegynder
24. april 2004 - 03:15 Der er 7 kommentarer og
2 løsninger

OOP: forståelse af operatoren this

hejsa

jeg sidder og roder lidt med swing's JFileChooser og har i den forbindelse strikket en FileFilter klasse sammen.
mit problem ligger nu i jeg ikke helt forstår this operatoren i sammenhæng med min Hashtable, hvad jeg fik ud af javadoc var at Hashtable er en slags key-indexeret ArrayList, i nedenstående bruges file extension altså som key og så mit FileFilter object som værdi, og umiddelbart synes jeg det virker mærkeligt.

håber nogen kan give mig en forklaring på dette fænomen.

her er lidt kode, sig til hvis hele klassen er påkrævet for at forstå sammenhængen:
public void addExtension(String extension) {
        if (filters == null) {
            filters = new Hashtable();
        }
        filters.put(extension.toLowerCase(), this);
        fullDescription = null;
    }
Avatar billede jakoba Nybegynder
24. april 2004 - 04:31 #1
metoder defineret i en klasse bor I den klasse, eller mere præcist i den instans af en klasse de adresseres igennem fx i klassen MinKlasse har vi metoden MinMetode

class MinKlasse {
    int x = 4;
    int y = 4;
    int MinMetode( char operator ) {
        if ( operator == '+' ) return x + y;
        if ( operator == '-' ) return x - y;
        //...
    }
}//endclass MinKlasse

metoden kan bruge de variabler der er i klassen fordi vi adresserer den ved at sige
    MinKlasse mk = new MinKlasse();
          // og så bruger mk til at fortælle HVILKEN instans vi vil kalde metoden i.
    sum = mk.MinMetode( '+' );    // skulle gerne give 8.

men der kan komme problemer hvis der er andre variable med de samme navne. en typisk sutuation er constructoren hvor vi ønsker at fortælle hvilke startværdier x og y skal have:

class MinKlasse {
    int x;
    int y;
    public MinKlasse( int x, int y ) {
        // vi øsker at sætte klassens variabel x til den værdi der gives
        // som parameter x. for at gøre det må vi bruge nøgleordet 'this'
        this.x        // this står for 'denher instans af denne klasse'; dvs variabelen
                =
                  x;  // efter javas regler er dette den 'nærmeste' x; dvs parameteren
        this.y = y;    // og ligesådan med y
    }
    int MinMetode( char operator ) {
        if ( operator == '+' ) return x + y;  // her er klasse variablerne nørmest
                                                    // så vi behøver ikke sige 'this'
        if ( operator == '-' ) return this.x - this.y;  // men det skader ikke :-))
        //...
    }
}//endclass MinKlasse

mvh JakobA

så this betyder simpelthen 'denneher instans af denne klasse'
hvis du lavede en instans
    MinKlasse olsen = new MinKlasse( 7, 16 );
        så betyder  this.x  indeni metoden MinMetode  olsen.x  når MinMetode kaldes med:
    int res = olsen.MinMetode( '-' );
Avatar billede jakoba Nybegynder
24. april 2004 - 04:32 #2
Det var generelt om 'this'.  Ja du kommer til at fortælle noget mere om jvad du prøver at gøre. Jeg ser ingen forbindelse til ordet this i den kode du giver.
Avatar billede arne_v Ekspert
24. april 2004 - 09:45 #3
Der er normalt 3 forskellige situationer hvor man bruger this:

1)  når man skal referere til instans members som nogle argumenter skygger for
    fordi de hedder det samme

2)  når man skal have en reference til sig selv med over i et metode kald

3)  når man skal kalde en constructor fra en anden constructor

#1 har Jakob på glimrende vis forklaret om

#2 er tyisk set i Swing programmering f.eks.

...
public class Foobar extends JFrame implements ActionListener {
  ...
      noget.addActionListener(this);
  ...
}

#3 er f.eks.

public class X {
  public X(int n) {
      ...
  }
  public X() {
      this(0);
  }
  ...
}

Som jeg klser din kode så har du et tilfælde af #2:

filters.put(extension.toLowerCase(), this);

Du skal kalde en metode med objektet selv.
Avatar billede martinbk Nybegynder
24. april 2004 - 14:02 #4
arne's punkt 1. og 3. har jeg forstået, og bruger dem også flittigt, så mit spørgsmål er nok mere swing relateret hvorfor jeg lige nødvendigvis skal sende en kopi af mit object med for hver eneste entry jeg putter i min HashTable, her er lidt kode hvis i vil prøve at forklare udfra (som jacob skrev)

import java.io.File;
import java.util.Hashtable;
import java.util.Enumeration;
import javax.swing.filechooser.FileFilter;

public class KasFileFilter extends FileFilter {
    private Hashtable filters = null;
    private String description = null;
    private String fullDescription = null;
    private boolean useExtensionsInDescription = true;
   
    public KasFileFilter() {
        this.filters = new Hashtable();
    }
   
    public KasFileFilter(String extension) {
        this(extension, null);
    }
   
    public KasFileFilter(String extension, String description) {
        this();
        if (extension != null)
            addExtension(extension);
        if (description != null)
            setDescription(description);
    }
   
    /**
    * Metode brugt til at definere om filen skal vises i JFileChooseren
    * Defineret i den Abstrakte klasse FileFilter og derfor et krav til klassen
    *
    * @return true hvis extension eksistere i filteret ellers false
    */
    public boolean accept(File f) {
        if (f != null) {
            if (f.isDirectory()) {
                return true;
            }
            String extension = getExtension(f);
            if (extension != null && filters.get(getExtension(f)) != null) {
                return true;
            }
        }
        return false;
    }
   
    /**
    * Retunere Extension på den givne fil
    * 
    * @return Fil extension
    */
    public String getExtension(File f) {
        if (f != null) {
            String filename = f.getName();
            int i = filename.lastIndexOf('.');
            if (i > 0 && i < filename.length() - 1) {
                return filename.substring(i + 1).toLowerCase();
            }
        }
        return null;
    }
    /**
    * Tilføjer en extension til Hashtabellen indeholdende alle extensions
    * 
    */
    public void addExtension(String extension) {
        if (filters == null) {
            filters = new Hashtable();
        }
        filters.put(extension.toLowerCase(), this);
        fullDescription = null;
    }
   
    /**
    * udformer et læsbart output brugt i JFileChooseren,
    * metoden er defineret i den abstrakte klasse FileFilter,
    * og derfor et krav til klassen
    */
    public String getDescription() {
        if (fullDescription == null) {
            if (description == null || isExtensionListInDescription()) {
                fullDescription = description == null ? "(" : description
                        + " (";
                Enumeration extensions = filters.keys();
                if (extensions != null) {
                    fullDescription += "." + (String) extensions.nextElement();
                    while (extensions.hasMoreElements()) {
                        fullDescription += ", ."
                                + (String) extensions.nextElement();
                    }
                }
                fullDescription += ")";
            } else {
                fullDescription = description;
            }
        }
        return fullDescription;
    }
   
    /**
    * Sætter den overordnede fil forklaring for den ønskede filtype
    *
    * @param description
    */
    public void setDescription(String description) {
        this.description = description;
        fullDescription = null;
    }
   
    /**
    * bruges til at ændre atributten der bestemmer om fileextensions skal
    * vises i JFileChooseren
    */
    public void setExtensionListInDescription(boolean b) {
        useExtensionsInDescription = b;
        fullDescription = null;
    }

    /**
    * Retunere om extensions skal vises i JFileChooseren
    * @return true / false
    */
    public boolean isExtensionListInDescription() {
        return useExtensionsInDescription;
    }
}

ovenstående klasse benyttes af swing's JFileChooser som jeg har i en statisk klasse med alle mine statiske dialog bokse:

public static String displayFileChooser() {
        JFileChooser jf = new JFileChooser();
        KasFileFilter filter = new KasFileFilter();
        filter.addExtension("kas");
        filter.setDescription("Konference filer");
        jf.setFileFilter(filter);
        int returnVal = jf.showOpenDialog(null);
        if(returnVal == JFileChooser.APPROVE_OPTION) {
            return jf.getSelectedFile().getAbsolutePath();
        }
        else {
            return null;
        }
    }
Avatar billede arne_v Ekspert
24. april 2004 - 14:09 #5
Du mener:

filters.put(extension.toLowerCase(), this);

?

Der gemmer du i hashtable med file extension som key og en referance til objektet
som value.

Umiddelbart kan jeg ikke se at du hiver valuen ud igen, så jeg kan ikke forklare
hvorfor det skulle være nødvendigt (måske er det ikke nødvendigt).
Avatar billede martinbk Nybegynder
24. april 2004 - 14:15 #6
ahh ofte hjælper det vist at læse dokumentationen, put() metoden på HashTable kræver 2 objecter, et som key og et som value, derfor fyldes der bare "noget" i value feltet, selvom det ikke bruges,  umiddelbart ville jeg så bare bruge en ArrayList (har jeg prøvet), men fandt så ud af JFileChooseren vil have en HashTable, men tak for indvigelsen begge to, hvis i lige smider et svar :)
Avatar billede arne_v Ekspert
24. april 2004 - 14:22 #7
svar
Avatar billede jakoba Nybegynder
24. april 2004 - 22:25 #8
ok :-)
Avatar billede jakoba Nybegynder
24. april 2004 - 22:25 #9
ups
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