24. april 2004 - 03:15Der 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; }
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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( '-' );
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.
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)
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; } }
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 :)
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.