J'ai longuement discuté avec un de mes amis de l'utilisation correcte et appropriée de la méthode principale en Java. Fondamentalement, nous avons une classe comme celle-ci:
public class AnImporter implements Runnable {
// some methods, attributes, etc.
}
Mais où mettre la méthode principale? J’estime qu’une bonne pratique consiste à "conserver le code là où il appartient", transformant ainsi le code ci-dessus en
public class AnImporter implements Runnable {
public static void main(String [] args){
// Startup code for Importer App here
}
// some methods, attributes, etc.
}
Alors que mon ami affirme que "le code de démarrage n'a rien à voir avec l'application elle-même", il devrait donc être placé dans une autre classe, comme celle-ci:
public class AnImporter implements Runnable {
// some methods, attributes, etc.
}
public class AnApplication {
// Nothing here
public static void main(String [] args){
AnImporter a = new AnImporter();
// Startup code here
}
// Nothing here
}
Malgré le fait que nous ayons discuté de la question pendant un certain temps, nous n’avons aucune conclusion quant à la meilleure approche à adopter pour Java. Quel est votre avis sur ce sujet? Où et surtout, pourquoi placez-vous votre méthode principale là où vous l'avez placée?
Je suis d'accord avec ton ami. Vous créez un service potentiellement réutilisable dans AnImporter qui pourrait éventuellement être utilisé dans plusieurs programmes avec plusieurs principaux. Donc, faire une spéciale principale et l'intégrer dans AnImporter n'a pas beaucoup de sens.
J'irais probablement avec votre ami, car je préférerais sortir le plus rapidement possible de la méthode principale. Cela facilite les tests lorsque vous souhaitez tester de manière atomique (uniquement la classe exécutable) ou vous voulez simuler des choses. Plus tôt vous vous écartez de la méthode principale, plus vous avez d'options. Si vous avez une classe avec la méthode principale et d'autres éléments, cela pourrait devenir rapidement compliqué. (même si cela peut ne pas sembler être le cas avec un exemple simple comme celui que vous décrivez)
Mais je dirais que la lisibilité et la testabilité sont deux bonnes raisons de sortir de la méthode principale (et de sa classe englobante) dès que possible. Mais bon… c'est juste moi;)
Je ne polluerais pas une classe Runnable avec une méthode principale. Il en va de même pour pratiquement toutes les classes faisant quelque chose dans votre application. Généralement, j'aurai un cours comme celui-ci:
public class App {
public static void main(String args[]) {
Thread t = new Thread(new Blah());
t.start();
synchronized (t) {
t.wait();
}
}
}
public class Blah implements Runnable {
public void run() {
// do normal stuff
}
}
au lieu de:
public class Blah implements Runnable {
public void run() {
// do normal stuff
}
public static void main(String args[]) {
Thread t = new Thread(new Blah());
t.start();
synchronized (t) {
t.wait();
}
}
}
C'est juste plus propre.
Je sépare toujours le principal du reste du code, pour plusieurs raisons:
1) Un élément principal est en quelque sorte un hack permettant à votre programme de démarrer à partir de la ligne de commande. Toute classe qui la contient ne devrait avoir qu'une seule responsabilité: laisser le programme démarrer à partir de la ligne de commande. En le mettant avec votre runnable principal, vous polluez le runnable.
2) Vous pourriez vous retrouver avec plusieurs réseaux (par exemple, avec certains paramètres par défaut, avec des modes spéciaux, etc.)
3) Vous pourriez finir par exécuter le programme à partir d’un environnement différent (par exemple, un plugin Eclipse ou un module OGSI, une applet, un outil Web, etc.). Dans ces cas, vous voudriez limiter l'accès à votre principal. Le mettre avec la fonctionnalité empêche que.
4) Il est parfois plus facile de laisser votre fichier principal dans le package par défaut pour accélérer l'exécution (par exemple, Java myblabla par1 par2 par3), mais vous ne voulez certainement pas que le reste de votre code soit dans le package par défaut.
L’interface avec main (une liste de chaînes) est pratiquement inutile, à l’exception du système d’exploitation.
Votre main principale devrait contenir le moins de code possible.
En effet, votre public class ThisIsMyApp {...}
ne devrait être que l’interface du système d’exploitation avec le vrai travail, qui est ailleurs.
Je séparerais la méthode principale du code.
Bien que j'ai aussi un type de projet différent. Cela n'inclut pas un vrai programme de travail pour une solution. Ici, j'ai besoin de solutions différentes pour différents problèmes en utilisant (et développant) la même bibliothèque. Différents problèmes ne sont pas parallèles. Je dois exécuter un seul problème à partir de mon IDE. J'ai trouvé pratique d'utiliser le même projet avec un grand nombre de classes avec les méthodes PSVM.
Ce projet contient des solutions de concours de programmation pour plus de 400 problèmes différents. Avez-vous une meilleure organisation pour cela?