JShell est un outil de ligne de commande permettant d'exécuter des extraits de code dans un environnement shell sans avoir à compiler et exécuter une application complète. JShell est une nouvelle fonctionnalité de Java 9. JShell peut être utilisé pour tester et déboguer des extraits de code lors du développement d'une application. L'entrée JShell doit se présenter sous la forme d'un extrait de code complet. Nous avons présenté JShell avec deux articles, "Utilisation de JShell dans Java 9 dans NetBeans 9.0, Partie 1" et "Utilisation de JShell dans Java 9 dans NetBeans 9.0, Partie 2", dans lesquels nous avons discuté de l'exécution de l'import déclaration, déclaration et utilisation de variables, comparaison de String s et les instructions en cours d'exécution. Dans cet article de continuation, nous exécuterons des extraits pour les méthodes Java. Cet article comporte les sections suivantes :
- Configuration de l'environnement
- Utiliser des méthodes
- Modification d'une définition de méthode
- Surcharge de méthode
- Faire une référence directe à une méthode
- Méthodes de mise en vente
- Modificateurs non autorisés dans les déclarations de méthode de niveau supérieur
- Conclusion
Configuration de l'environnement
Téléchargez et installez NetBeans, comme indiqué dans un article précédent. Lancez JShell en sélectionnant Outils>Ouvrir Java Platform Shell , comme le montre la figure 1.
Figure 1 : Outils>Ouvrir Java Platform Shell
Utiliser des méthodes
Une méthode est déclaré dans JShell comme il l'est dans une application Java, avec quelques différences, qui sont également abordées dans cette section. Par exemple, déclarez une méthode triple(int) qui prend un int argument et renvoie un int valeur.
int triple(int i) { return i*3; }
Exécutez l'extrait de code dans JShell et une méthode est créée.
[10]-> int triple(int i) { return i*3; } | created method triple(int)
Appelez la méthode triple avec un int valeur comme argument
triple(1)
La valeur de l'argument est triplée et renvoyée.
[11]-> triple(1) | $13 ==> 3 [12]->
La méthode a un type de retour et des paramètres mais pas de modificateur d'accès tel que public , privé , ou protégé . C'est parce qu'une déclaration de méthode de niveau supérieur, comme toutes les déclarations de niveau supérieur, est implicitement publique. Tout modificateur d'accès dans une déclaration de méthode de niveau supérieur est ignoré. Toutes les déclarations de méthode suivantes sont équivalentes à la déclaration de méthode précédente.
[1]-> private int triple(int i){ return 3*i; } | created method triple(int) [2]-> protected int triple(int i){ return 3*1; } | replaced method triple(int) [3]-> public int triple(int i){ return 3*i; } | replaced method triple(int) [4]->
JShell affiche les erreurs de compilation, le cas échéant. Par exemple, rendez le type de retour de la méthode triple comme chaîne et un message d'erreur s'affiche.
[10]-> String triple(int i) { return i*3; } | Error: | incompatible types: int cannot be converted to java.lang.String | return i*3; | ^-^
Modification d'une définition de méthode
Un message de sortie qui ne serait pas généré par une application Java et déjà répertorié deux fois dans cette section est "méthode remplacée…". Le message indique qu'une définition de méthode a été modifiée. La disposition permettant de remplacer/modifier une déclaration de méthode et d'autres déclarations vise à faciliter les tests.
Pour modifier ou remplacer une méthode sans définir une nouvelle méthode, la signature de la méthode, qui est définie par le nom de la méthode et les paramètres de la méthode, y compris le nombre de paramètres, leur type et leur ordre, ne doit pas être modifiée. Par exemple, déclarez une méthode hello avec le type de retour void et une chaîne paramètre de type.
[4]-> void hello(String s){ } | created method hello(String)
Ensuite, déclarez la même méthode hello avec le type de retour String , une chaîne paramètre de type et une instruction de retour. La déclaration de méthode précédente pour hello est remplacé.
[5]-> String hello(String s){ return "Hello " + s; } | replaced method hello(String) [6]->
Appelez la méthode hello(String) et la deuxième définition de méthode est invoquée pour générer un message "Hello John".
[6]-> hello("John") | $5 ==> "Hello John" [7]->
Les arguments de la méthode sont concaténés dans l'invocation de la méthode, si nécessaire, comme dans l'extrait suivant.
[7]-> hello("John"+" & "+"Johnny") | $22 ==> "Hello John & Johnny" [8]->
Dans l'exemple précédent de modification d'une méthode, nous avons remplacé le type de retour void avec chaîne . Return n'a pas besoin d'être modifié pour remplacer une méthode. Par exemple, définissez une méthode hello comme suit.
[15]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String)
Ensuite, modifiez uniquement le retour déclaration. La méthode hello(String,String) est remplacé.
[16]-> String hello(String str1, String str2){ return "Hello"+str1+str2; } | replaced method hello(String,String)
Comme autre exemple d'exécution d'un extrait de code de méthode, définissez une méthode hello(String str1, String str2) avec le type de retour String[] .
[17]-> String[] hello(String str1, String str2){ return new String[]{str1,str2}; } | created method hello(String,String)
Appelez la méthode avec deux arguments pour renvoyer un tableau.
[18]-> hello("John","Michael") | $39 ==> String[2] { "John", "Michael" }
Surcharge de méthode
Une méthode peut être surchargée comme dans une application Java. Déclarer une méthode hello(String s) .
[1]-> String hello(String s){ return "Hello " + s; } | created method hello(String)
Appelez la méthode pour afficher un message.
[2]-> hello("John") | $1 ==> "Hello John"
Déclarez une autre méthode hello(String,String) .
[3]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String)
Appelez la méthode pour afficher un message.
[5]-> hello("Hello"," John") | $16 ==> "Hello John"
Faire une référence directe à une méthode
JShell prend en charge les références directes à une méthode. Une référence avant appelle une méthode qui n'a pas encore été définie. Déclarer une méthode main(String) qui fait référence à une méthode hello(String) , qui n'a pas encore été défini. La méthode main(String) est créé mais il ne peut pas être appelé jusqu'à ce que la méthode hello(String) est défini.
[1]-> String main(String str){ return "Hello "+hello(str); } | created method main(String), however, it cannot be invoked until | method hello(java.lang.String) is declared
Invoquer la méthode main(String) et un message obtient une sortie, indiquant qu'il ne peut pas être appelé.
[2]-> main("Michael") | attempted to call method main(String) which cannot be invoked | until method hello(java.lang.String) is declared
Déclarez la méthode hello(String) qui est référencé par main(String) .
[3]-> String hello(String name){ return name; } | created method hello(String)
Ensuite, appelez la méthode main(String) à nouveau et il est invoqué.
[4]-> main("Michael") | $1 ==> "Hello Michael"
Le ";" est ajouté implicitement s'il n'est pas ajouté dans les déclarations de variable de niveau supérieur et les déclarations de méthode qui sont ajoutées une par ligne. Mais le ";" n'est pas implicite dans les instructions d'une méthode. Par exemple, déclarez la méthode suivante et une erreur sera générée.
[1]-> int average(int i,int j){ return (i+j)/2 } | Error: | ';' expected
Méthodes de liste
Les méthodes définies dans une session JShell donnée sont listées avec /methods commande. Pour démontrer, définissez quelques méthodes.
[1]-> int triple(int i) { return i*3; } | created method triple(int) [2]-> String hello(String s){ return "Hello" + s; } | created method hello(String) [3]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String) [4]-> int average(int i,int j){ return (i+j)/0; } | created method average(int,int)
Exécutez les /methods commande, et toutes les méthodes ajoutées sont listées.
[5]-> /methods | printf (String,Object...)void | triple (int)int | hello (String)String | hello (String,String)String | average (int,int)int [5]->
Modificateurs non autorisés dans les déclarations de méthode de niveau supérieur
Alors que les modificateurs public , privé , et protégé dans les déclarations de méthode de niveau supérieur sont ignorées et une définition de méthode est créée implicitement avec un accès public, certains autres modificateurs ne sont pas ignorés et ne sont pas autorisés dans une déclaration de méthode de niveau supérieur. Ces modificateurs ne sont pas autorisés au niveau supérieur car ils ont une signification dans un certain contexte et ne conviennent pas dans le contexte de JShell, qui consiste à tester des extraits de code.
Le modificateur static a une signification lorsqu'il est utilisé avec une méthode dans le contexte d'une classe ou d'une interface, mais pas au niveau supérieur. Par exemple, exécutez la déclaration de méthode suivante qui inclut static .
[1]-> static String hello(String name){ return "Hello "+name; } | Warning: | Modifier 'static' not permitted in top-level declarations, | ignored | static String hello(String name){ | ^----^ | created method hello(String)
Le statique modificateur est ignoré, un avertissement est émis, mais une méthode est créée. La méthode peut être invoquée.
[2]-> hello("John") | $1 ==> "Hello John" [3]->
De même, le modificateur final n'a pas de signification au niveau supérieur, que ce soit dans une déclaration de méthode ou toute autre déclaration, car JShell est conçu pour exécuter dynamiquement des extraits de code et déclarer une méthode (ou une variable ou une classe) final rendrait l'extrait non modifiable. Par exemple, ajoutez le final modificateur d'une méthode. La finale modificateur est ignoré, un avertissement est généré et la définition de méthode est créée sans le final .
[2]-> final int triple(int i){ return 3*i; } | Warning: | Modifier 'final' not permitted in top-level declarations, | ignored | final int triple(int i){ | ^---^ | created method triple(int)
Appelez la méthode et elle affiche un résultat.
[3]-> triple(5) | $1 ==> 15 [4]->
Certains autres modificateurs ne sont pas non plus autorisés au niveau supérieur, que ce soit dans une méthode ou dans toute autre déclaration. Alors que les modificateurs statiques et finale sont ignorés et une définition de méthode est créée, les modificateurs abstract et natif dans une méthode de niveau supérieur, génère une erreur et une méthode n'est pas créée.
[1]-> abstract String hello(String s){ return "Hello "+s; } | Error: | Modifier 'abstract' not permitted in top-level declarations | abstract String hello(String s){ | ^------^ [1]-> [1]-> native String hello(String s){ return "Hello "+s; } | Error: | Modifier 'native' not permitted in top-level declarations | native String hello(String s){ | ^----^
Modificateurs par défaut et synchronisé dans une déclaration de méthode de niveau supérieur ou toute autre déclaration ne sont pas non plus autorisées et génèrent une erreur.
Conclusion
Dans cet article, nous avons discuté de l'exécution d'extraits de code pour les méthodes Java dans JShell. Dans un article ultérieur, nous discuterons de l'exécution d'extraits de code pour les classes, les interfaces et les tableaux Java.