compilation de xxx.java et création de xxx$1.java et xxx$2.java - Java - Programmation
Marsh Posté le 20-05-2003 à 15:43:18
Classes internes
Marsh Posté le 20-05-2003 à 15:57:55
Taiche a écrit : Classes internes |
A priori je n'ai qu'une classe dans mon .java :
public class JUploadApplet extends Applet {
Marsh Posté le 20-05-2003 à 16:00:25
ça m'est déjà arrivé : jamais compris pkoi
Marsh Posté le 20-05-2003 à 16:17:36
persepolis a écrit : |
t'as surement une classe anonyme interne du genre
setWindowAdadpter(new WindowAdapter() {
System.exit(0);
}
}
d'ailleurs si elle etait pas anonyme le .class s'appellerait ClasseA$InnerClass.class
Marsh Posté le 20-05-2003 à 16:26:59
the real moins moins a écrit : t'as surement une classe anonyme interne du genre |
+1
Marsh Posté le 20-05-2003 à 17:30:23
persepolis a écrit : Voila tout est dans le titre. |
rien ne change à ce que je vois
Marsh Posté le 20-05-2003 à 17:31:06
persepolis a écrit : Voila tout est dans le titre. |
De rien, C'était avec plaisir.
Marsh Posté le 20-05-2003 à 20:29:19
the real moins moins a écrit : t'as surement une classe anonyme interne du genre |
+1
Marsh Posté le 21-05-2003 à 08:29:00
Je vous passe mon bout de code ...
Une petite précision:
xxx.java génère à la compil xxx.class xxx$1.class et xxx$2.class
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
public class xxxApplet extends Applet {
//------------- INFORMATION --------------------------------------------
public static final double VERSION = 2.0;
public static final String AUTHOR = "Stephane PERDRIX";
public static final String AUTHOR_EMAIL = "stephane.Perdrix@ipmfrance.com";
public static final String DESCRIPTION = "Java Applet wrapper for JUploadPanel.";
public static final String LAST_MODIFIED = "01 July 2002";
public final static String DEFAULT_POST_URL = "http://localhost:8080/";
public final static String DEFAULT_LOCAL_DIR = "DStl/Client_Log/";
public final static String DEFAULT_CIBLE_DIR = "DStl/";
public final static String DEFAULT_FICHIER_ZIP = "DDownload/outfile.zip";
/*----------------------------------------------------------------------
private static Logger log = Logger.getLogger(JUploadApplet.class.getName());
//private static Logger log = Logger.getRootLogger();
------------------------------------------------------------------------ */
//Get a parameter value
private boolean isStandalone = false;
public String getParameter(String key, String def) {
return isStandalone ? System.getProperty(key, def) :
(getParameter(key) != null ? getParameter(key) : def);
}
//Initialize the applet
public void init() {
// Getting Parameters.
String postURL = this.getParameter("postURL", DEFAULT_POST_URL);
String localDIR = this.getParameter("localDIR", DEFAULT_LOCAL_DIR);
String cibleDIR = this.getParameter("cibleDIR", DEFAULT_CIBLE_DIR);
String fileZIP = this.getParameter("fileZIP", DEFAULT_FICHIER_ZIP);
this.setLayout(new BorderLayout());
//Essai de gestion des logs
JTextArea status = new JTextArea(15, 10) {
// Overwriting the default Append class such that it scrolls to the
// bottom of the text. The JFC doesn't always rememeber to do that.
public void append(String str) {
super.append(str);
super.setCaretPosition(super.getText().length());
}
};
status.setBackground(new Color(229, 229, 229));
status.setEditable(false);
status.setLineWrap(true);
status.setWrapStyleWord(true);
JUploadPanel jp = new JUploadPanel(postURL, localDIR, cibleDIR, fileZIP, null,
null, null, null, null, null, null, null, null, status, null, this);
jp.addDoAfterUploadSucc(null);
this.add(jp, BorderLayout.CENTER);
/*status.append("INFO : Post URL = " + postURL + "\n" );
status.append("INFO : Local DIR = " + localDIR + "\n" );
status.append("INFO : Cible DIR = " + cibleDIR + "\n" );
status.append("INFO : Fichier ZIP = " + fileZIP + "\n" );
try {
getAppletContext().showDocument(new URL(getCodeBase()+"index.jsp" ));
} catch (Exception e) {
e.printStackTrace();
}*/
}
public void stop() {
System.out.println("INFO : Methode STOP de l'applet\n" );
}
public void destroy() {
System.out.println("INFO : Methode DESTROY de l'applet\n" );
}
}
J'vois que The dark n'a pas perdu sa forme légendaire...
Marsh Posté le 21-05-2003 à 08:31:48
t'as lu les réponses ? regarde ce que t'as du bobuse et compare avec ton code
Marsh Posté le 21-05-2003 à 08:53:32
J'savais pas qu'on pouvait faire ça : surcharger une méthode d'une classe sans définir explicitement de nouvelle classe. ça peut servir ça, 'faut que je m'en rappelle.
Marsh Posté le 21-05-2003 à 09:45:00
mais gros boolay on t'a déjà donné la réponse. Tu les lis les réponses au moins ou tu veux qu'on te donne le numéro de ligne plus explications?
Marsh Posté le 21-05-2003 à 10:04:03
El_gringo a écrit : J'savais pas qu'on pouvait faire ça : surcharger une méthode d'une classe sans définir explicitement de nouvelle classe. ça peut servir ça, 'faut que je m'en rappelle. |
Ca s'apelle une classe anonyme, ca peut etre assez crade, mais ca peut etre aussi bougrement pratique ...
benou > c'est plutot taiche et -- qui ont repondu
Marsh Posté le 21-05-2003 à 10:12:05
ReplyMarsh Posté le 21-05-2003 à 11:02:57
bobuse a écrit : |
Typiquement les Adapter pour les interfaces graphiques ; t'as pas forcément envie de te taper une classe à part entière juste pour faire un System.exit(0) quand l'utilisateur ferme la fenêtre
Marsh Posté le 21-05-2003 à 11:11:41
Taiche a écrit : |
Ouais, ou à la limite, pour des FilenameFilter. Enfin, typiquement, quand il y a une seule méthode à redéfinir, courte, et qui est spécifique, ça peut être utile. J'vais déja entendu parler des classes anonymes, mais sans savoir vraiment ce que c'était.
Donc les classes anonymes, c'est ça, et uniquement ça ?
Marsh Posté le 21-05-2003 à 11:14:33
El_gringo a écrit : |
Moi, le dernier FilenameFilter que j'ai fait, j'y ai foutu plein d'options et tout de façon à ce qu'il soit hyper générique et du coup j'le réutilise tout l'temps. Donc moyen pour une classe interne et carrément pas envisageable comme classe anonyme
Marsh Posté le 21-05-2003 à 11:21:41
Taiche a écrit : |
fais peter
Marsh Posté le 21-05-2003 à 11:26:00
bobuse a écrit : |
J'le mettrai en ligne ce soir, si ça t'intéresse.
Il est d'ailleurs pas forcément optimisé au niveau du code, donc si y a quelqu'un qui se sent d'attaque pour trouver les merdes et me foutre la gueule dedans, ça s'rait sympa Pis j'apprendrai des trucs, comme ça
L'idée c'est que le machin accepte les * et tu peux gérer l'accept des répertoires. J'en avais pas trouvé sur le Net qui me satisfasse, mais si ça s'trouve ça existe depuis
Marsh Posté le 21-05-2003 à 11:42:34
lol, moi ca me fait penser que je m'etais fais ch*** aussi pour faire un composant graphique, et puis il a été ajouté qques mois aprés dans swing (ticker)
Marsh Posté le 21-05-2003 à 12:03:46
bobuse a écrit : |
j'allais le dire
benou
Marsh Posté le 21-05-2003 à 14:00:34
Taiche a écrit : |
Ouais, j'sais pas!
De toute façon, il sera forcément moins générique que l'interface FilenameFilter
Il fait le filtrage par expressions régulières ton FilenameFilter ?
Marsh Posté le 21-05-2003 à 14:06:03
El_gringo a écrit : |
Bin j'voulais le faire mais fallait qu'il marche en 1.2 donc comme j'avais pas super envie de me retaper toute l'analyse du bordel, j'l'ai pas fait
Marsh Posté le 21-05-2003 à 16:39:41
El_gringo a écrit : |
En plus de pas avoir de nom, elle est "inner", incluse dans une autre classe.
Explication : toute instance de cette classe est liée à une (et une seule) instance de la classe qui l'enveloppe. Elle peut donc accéder à ce que l'instance de la classe enveloppante contient.
On est donc à 2 doigts des closures.
Une closure est un bout de codee qui peut accéder à l'ensemble de l'environnement où il est définit, tout en étant exécuté plus tard. Dans le cas ded java, l'environnement, c'est tout ce qui est statique (donc toujours accessible) et le contenu de l'instance courante et des instances "englobantes" pour les classes "inner".
Petite démo :
Code :
|
On a un bel outil (bon, pas typé, on verra ça dans la version 1.5 du langage) pour faire de la programmation fainéante.
une petite conversiont d'arbre acyclique en arbre possédant un pointeur sur le parent dans le style fonctionnel pour bien montrer la ressemblance avec http://forum.hardware.fr/forum2.ph [...] =1#t319874
un petit diagramme introductif :
Les LMachin sont les classes de l'abre de départ acyclique
Les Machin sont les classes de l'arbre d'arrivée avec pointeur sur les parents
Code :
|
(code complet sur http://nraynaud.com/HFR )
Et voilà, un petit exemple de rapprochement entre 2 fonctionnalités assez distinctes.
Par contre, ATTENTION au mélange closures/effets de bord ! Les gens qui programment en O'caml le savent, en java faites gaffe (si vous avez la certitude d'avoir toujours accès à un objet de l'environnement, mais son état peut avoir changé depuis la définition de la closure et rendre le code de la closure plantageux).
Marsh Posté le 21-05-2003 à 17:37:06
ReplyMarsh Posté le 21-05-2003 à 17:56:37
t'as des articles sur ce sujet, paske la moi je pige pas tout ... mais ca a l'air interessant
Marsh Posté le 21-05-2003 à 18:14:44
bobuse a écrit : t'as des articles sur ce sujet, paske la moi je pige pas tout ... mais ca a l'air interessant |
java et lazy, non, je suis en train d'en écrire un.
je viens de trouver ça dans google :
http://www.javaworld.com/javaworld [...] tip67.html
les inner-class c'est dans la spec du langage (il doit y avoir des articles qui traînent aussi sur le net mais j'en ai jamais lu) : http://java.sun.com/docs/books/jls [...] tml#247506
Les concepts fainéans, des petites intros à des langages fainéans,
- le plus accessible, le module lazy de O'caml :
http://caml.inria.fr/ocaml/htmlman/libref/Lazy.html
- haskell :
http://www.haskell.org/tutorial/
- mercury :
http://www.cs.mu.oz.au/research/mercury/
Sur les closures et la lambda calcul, n'importe quelle doc sur un langage fonctionnel doit en parler.
Marsh Posté le 20-05-2003 à 15:33:59
Voila tout est dans le titre.
Merci pour vos explications ...