IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Enlever la méthode main


Sujet :

Langage Java

  1. #1
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut Enlever la méthode main
    Bonjour,

    J'ai vu sur le net une implémentation un peu spéciale, qui marche sans le moindre doute, mais je trouve ça affreux.

    Je voulais avoir vos avis, la voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Sample {
        static {
            System.out.println("Hello Word !!");
        }
    }
    source : http://browntips.com/trick-java-program-with-out-main/
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Alain Defrance Voir le message
    mais je trouve ça affreux.
    Pas mieux !

    Citation Envoyé par Alain Defrance Voir le message
    qui marche sans le moindre doute,
    Cela remonte quand même une exception (main() not found)

    a++

  3. #3
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Cela remonte quand même une exception (main() not found)
    En effet, mais c'est encore pire, ca remonte une error : Exception in thread "main" java.lang.NoSuchMethodError: main

    Pour utiliser cette classe ca va être chaud, va vraiment falloir faire tous les appels dans le bloc static :p
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  4. #4
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    plus fumant: un jour un stagiaire m'a demandé s'il était possible de lancer une application Java autrement que par la méthode magique "main"...
    C'est possible en modifiant le code C du lanceur, mais je me suis toujours demandé pourquoi il voulait faire ça ...
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  5. #5
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Je vois pas vraiment l'intérêt. Vraiment pas. Mais alors pas du tout.
    Bref, après cette contribution du tonnerre, ...

    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  6. #6
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Citation Envoyé par professeur shadoko Voir le message
    plus fumant: un jour un stagiaire m'a demandé s'il était possible de lancer une application Java autrement que par la méthode magique "main"...
    C'est possible en modifiant le code C du lanceur, mais je me suis toujours demandé pourquoi il voulait faire ça ...
    Autant créer un nouveau langage basé sur la JVM :p, ca sera encore plus simple .
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  7. #7
    Invité
    Invité(e)
    Par défaut
    Juste pour apporter ma pierre a l'édifice, je ne pense pas que cette manière de faire soit plus horrible qu'une autre.

    Certes elle n'est pas du tout adaptée au langage Java, mais elle a l'avantage d'enlever ce vieil héritage venant de la programmation procédurale.

    Pourquoi diable devons nous passer par une méthode nommée "main" pour lancer notre application ?

    Une simple modification du langage pourrait nous donner quelque chose de bien plus orienté objet, et bien moins procédural.

    En poussant dans les extrêmes, on pourrait aller jusqu'à dire que l'orienté objet devrait pouvoir fonctionner sans aucune méthode.

    Donc encore une fois, la façon de procéder ici n'est pas appropriée, mais elle n'est pas si inesthétique pour autant.

    Etant donné que ce sujet a donné lieu a une petite session débat (très légère) entre Alain et moi-même voici un argument que j'ai avancé, non pas en faveur du bloc statique, mais plutôt en défaveur du main().

    Premier point, pourquoi "main", pourquoi pas quelque chose de plus souple ?
    Pourquoi toute une méthode avec des arguments bien précis, une visibilité, une valeur de retours fixés ? D'ailleurs a ce compte, pourquoi une méthode ?

    Il est certain qu'il y a quelques années lorsque l'on voulait convertir des développeurs C au java il était plus simple de leur proposer une méthode principale nommée main, prenant en paramètre les paramètres de l'application.

    Alors quitte à faire, j'apporte une possible solution.

    Pourquoi ne pas avoir au même titre qu'un bloc statique un bloc main{}.
    Faire de ce fameux main un mot clef dans des cas précis. Et si ce n'est main, autre chose ?
    Evidemment pour ce qui est du Java c'est beaucoup trop tard, mais l'idée est là.

    Ainsi avec un main{} nous pourrions avoir un point d'entrée qui ne serait pas une méthode.

    Quant aux arguments, il pourraient être disponibles depuis la classe System.
    Enfin point sur le quel je n'ai que trop peu réfléchis, serait la possibilité de mettre ce bloc en dehors d'une classe.

    Quoi qu'il en soit, sans défendre corps et âme cette idée de bloc static{} pour démarrer l'application, je trouve que c'est osé, et pourquoi pas, vu sous un certain angle, intéressant comme approche. Et peut-être, comme je disais plus tôt, élégant comme solution, bien qu'inadapté.

    Je sens d'ici les personnes qui ne vont pas se privé de me traiter d'hérétique mais bon, main() ne m'a pas l'air d'être une solution parfaite.

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Makkhdyn Voir le message
    Pourquoi diable devons nous passer par une méthode nommée "main" pour lancer notre application ?
    Et pourquoi diable utilisé un bloc static ? En quoi est-ce mieux ???

    Citation Envoyé par Makkhdyn Voir le message
    Donc encore une fois, la façon de procéder ici n'est pas appropriée, mais elle n'est pas si inesthétique pour autant.
    Cela a un second gros défaut : le bloc static est exécuté au chargement de la classe. Du coup cela peut être exécuté involontairement en cas d'une simple utilisation de la classe...


    Citation Envoyé par Makkhdyn Voir le message
    Pourquoi ne pas avoir au même titre qu'un bloc statique un bloc main{}.
    Faire de ce fameux main un mot clef dans des cas précis. Et si ce n'est main, autre chose ?
    Evidemment pour ce qui est du Java c'est beaucoup trop tard, mais l'idée est là.

    Ainsi avec un main{} nous pourrions avoir un point d'entrée qui ne serait pas une méthode.
    Donc si je comprend bien on remplacerais une méthode static par une bloc static... On y gagne quoi en fait ?


    a++

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Et pourquoi diable utilisé un bloc static ? En quoi est-ce mieux ???
    Attention, comme je l'ai dis, ce n'est pas tant le bloc static qui est intéressant à voir, mais plutôt le bloc "point d'entrée" remplaçant la méthode point d'entrée.

    Citation Envoyé par adiGuba Voir le message
    Cela a un second gros défaut : le bloc static est exécuté au chargement de la classe. Du coup cela peut être exécuté involontairement en cas d'une simple utilisation de la classe...
    Encore une fois, je ne défend pas le bloc static qui est totalement inadapté. Je dis simplement que l'approche mérite le coup d'oeil.

    Citation Envoyé par adiGuba Voir le message
    Donc si je comprend bien on remplacerais une méthode static par une bloc static... On y gagne quoi en fait ?
    Question d'esthétique. Niveau fonctionnel c'est strictement la même chose. Niveau sémantique c'est plus logique (à mon goût).


    EDIT:
    Et non je ne préconise pas la solution du bloc static. Comme il a été dit judicieusement auparavant, c'est plus dangereux et cause de bugs qu'autre chose.

  10. #10
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    Citation Envoyé par Makkhdyn Voir le message
    Pourquoi diable devons nous passer par une méthode nommée "main" pour lancer notre application ?
    Essaie d'ouvrir le .class du .java qui contient ton main avec un editeur hexa et lit la premiere ligne... tu vas comprendre pourquoi... Après on nous dis que les developpeur n'ont pas d'humour...
    La javaDoc est mon amie, elle est la tienne aussi!

  11. #11
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Citation Envoyé par Torg666 Voir le message
    Essaie d'ouvrir le .class du .java qui contient ton main avec un editeur hexa et lit la premiere ligne... tu vas comprendre pourquoi... Après on nous dis que les developpeur n'ont pas d'humour...
    Si tu fais référence au "cafe babe", il n'y est pas que là ou il y a la class main, et je ne vois pas le rapport
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Bonne chance pour jouer avec plusieurs threads en utilisant cette (hum) astuce (hum)

  13. #13
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    Citation Envoyé par Alain Defrance Voir le message
    Si tu fais référence au "cafe babe", il n'y est pas que là ou il y a la class main, et je ne vois pas le rapport
    Tu as tout a fait raison... je sais pas où je suis allé chercher ça tiens... melaculpa
    La javaDoc est mon amie, elle est la tienne aussi!

  14. #14
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    hooo la belle crasse


    alors pourquoi main()? Parce que objet ou pas objet, il faut bien un point de départ. Quand on me dit que ce n'est pas orienté objet une "méthode", je m'insurge. Les méthodes font partie du language objet. Un objet, ce sont des propriété et des méthodes. On pourrait effectivement arguer du fait que la méthode soit statique. Une interface "Program" a implémenter avec des méthodes précises (setArguments(String[] argv), run() ) aurait peut-être été plus objet. Mais ce n'est pas ce qui a été choisi et, en informatique comme dans tous le reste d'ailleurs, l'héritage historique, ca a un poids énorme (après tout, la taille des réservoirs de la navette spatiale est fonction de la largeur de l'arrière train d'un cheval moyen de l'époque romaine....).

    PS: si tu veux pousser le vice de pas utiliser main, tu peux coder tout ton programme dans un Agent.


    ....
    Ou implémenter une applet :p

  15. #15
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    hooo la belle crasse


    alors pourquoi main()? Parce que objet ou pas objet, il faut bien un point de départ. Quand on me dit que ce n'est pas orienté objet une "méthode", je m'insurge. Les méthodes font partie du language objet. Un objet, ce sont des propriété et des méthodes. On pourrait effectivement arguer du fait que la méthode soit statique. Une interface "Program" a implémenter avec des méthodes précises (setArguments(String[] argv), run() ) aurait peut-être été plus objet. Mais ce n'est pas ce qui a été choisi et, en informatique comme dans tous le reste d'ailleurs, l'héritage historique, ca a un poids énorme (après tout, la taille des réservoirs de la navette spatiale est fonction de la largeur de l'arrière train d'un cheval moyen de l'époque romaine....).

    PS: si tu veux pousser le vice de pas utiliser main, tu peux coder tout ton programme dans un Agent.


    ....
    Ou implémenter une applet :p
    Effectivement j'aurais du plus détailler mon désagrément concernant la méthode _statique_ main.

    Mais comme tu(vous) le dis(tes), c'est ce qui a été choisi. Je ne questionne pas le fonctionnement actuel, je ne propose même pas de changer quoi que ce soit dans Java pour ce point. Je dis juste qu'une méthode main "magique" bien que venant de l'héritage et de l'histoire de la programmation, n'est pas forcement ce qui est plus adapté.

    Cependant les choses étant ce qu'elles sont, essayer de contourner le fonctionnement normal ne mènera pas bien loin.

    Donc encore une fois:
    Oui le bloc static est moche, et non ce n'est pas une solution envisageable. Le seul point que je tentais de soulever ici était le fait qu'un bloc d'initialisation de l'application pourrait-être plus adapté qu'une méthode d'initialisation.

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Dans ce cas, on conceptualise un peu et on crée une classe point d'entrée, avec une méthode (statique, soit) point d'entrée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Main {
      public static void main (String... args) {
        MyApplication application = new MyApplication();
        application.start();
      }
    }


    Enfin, ne dit-on pas qu'"avec des 'si', on met Paris en bouteille" ?

    Et puis, il y aura toujours un main quelque part... Ne fut-ce que celui écrit en C pour démarrer la JVM.

  17. #17
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    avantage de la méthode statique, on peux avoir plusieurs main. J'ai vu ce concept utilisé parfois pour des tests unitaire. Certaines classes possédaient un main en plus de leurs méthode normale, avant de s'auto tester (enfin je préfère quand meme avoir des tests a part)

  18. #18
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    J'ai vu ce concept utilisé parfois pour des tests unitaire. Certaines classes possédaient un main en plus de leurs méthode normale, avant de s'auto tester (enfin je préfère quand meme avoir des tests a part)
    Sur le projet que j'ai récupéré, ils font ca. Ca pique un peu mais pourquoi pas
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  19. #19
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Alain Defrance Voir le message
    Sur le projet que j'ai récupéré, ils font ca. Ca pique un peu mais pourquoi pas
    c'est juste embetant de devoir embarquer les test dans la version finale ca bouffe de la place dans le classloader.... Effectivement, ca pique un peu les yeux

Discussions similaires

  1. Réponses: 10
    Dernier message: 28/06/2007, 21h42
  2. paramêtres de la méthode main()
    Par aazize dans le forum C
    Réponses: 1
    Dernier message: 17/12/2006, 10h27
  3. [JBX] Spécifier la méthode main
    Par fafa139 dans le forum JBuilder
    Réponses: 1
    Dernier message: 15/08/2006, 11h36
  4. Débuts : classe / méthode main
    Par P@t dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 10/07/2004, 03h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo