Java 9 - Onderzoek naar de REPL

1. Inleiding

Dit artikel gaat over jshell, een interactief REPL (Read-Evaluate-Print-Loop) console die is gebundeld met de JDK voor de komende Java 9-release. Voor degenen die niet bekend zijn met het concept, maakt een REPL het mogelijk om interactief willekeurige codefragmenten uit te voeren en hun resultaten te evalueren.

Een REPL kan handig zijn voor zaken als het snel controleren van de haalbaarheid van een idee of het uitzoeken van b.v. een opgemaakte tekenreeks voor Draad of SimpleDateFormat.

2. Hardlopen

Om te beginnen moeten we de REPL uitvoeren, wat wordt gedaan door het aanroepen van:

$ JAVA_HOME / bin / jshell

Als meer gedetailleerde berichten vanuit de shell gewenst zijn, a -v vlag kan worden gebruikt:

$ JAVA_HOME / bin / jshell -v

Als het klaar is, worden we begroet door een vriendelijk bericht en een bekende prompt in Unix-stijl onderaan.

3. Methoden definiëren en oproepen

Methoden kunnen worden toegevoegd door hun handtekening en hoofdtekst te typen:

jshell> void helloWorld () {System.out.println ("Hallo wereld");} | gemaakte methode helloWorld ()

Hier hebben we de alomtegenwoordige "hallo wereld" -methode gedefinieerd. Het kan worden aangeroepen met de normale Java-syntaxis:

jshell> helloWorld () Hallo wereld

4. Variabelen

Variabelen kunnen worden gedefinieerd met de normale Java-declaratiesyntaxis:

jshell> int i = 0; i ==> 0 | creëerde variabele i: int jshell> String company = "Baeldung" company ==> "Baeldung" | aangemaakt variabel bedrijf: String jshell> Date date = new Date () date ==> Sun Feb 26 06:30:16 EST 2017 | aangemaakte variabele datum: Datum

Merk op dat puntkomma's optioneel zijn. Variabelen kunnen ook worden gedeclareerd zonder initialisatie:

jshell> Bestand bestand bestand ==> null | gemaakt variabel bestand: File

5. Uitdrukkingen

Elke geldige Java-expressie wordt geaccepteerd en het resultaat van de evaluatie wordt weergegeven. Als er geen expliciete ontvanger van het resultaat wordt opgegeven, worden 'scratch'-variabelen gemaakt:

jshell> String.format ("% d flessen bier", 100) $ 6 ==> "100 flessen bier" | creëerde scratch-variabele $ 6: String

De REPL is hier erg handig door ons te informeren dat het een scratch-variabele heeft gemaakt met de naam $6 welke waarde is "100 flessen bier aan de muur" en het type is Draad.

Uitdrukkingen met meerdere regels zijn ook mogelijk. Jshell is slim genoeg om te weten wanneer een uitdrukking onvolledig is en zal de gebruiker vragen om verder te gaan op een nieuwe regel:

jshell> int i = ...> 5; i ==> 5 | gewijzigde variabele i: int | update overschreven variabele i: int

Merk op hoe de prompt veranderde in een ingesprongen …> om de voortzetting van een uitdrukking aan te duiden.

6. Commando's

Jshell biedt nogal wat meta-commando's die niet gerelateerd zijn aan het evalueren van Java-statements. Ze beginnen allemaal met een schuine streep (/) om te onderscheiden van normale bewerkingen. We kunnen bijvoorbeeld een lijst met alle beschikbare commando's opvragen door te geven /helpen of / ?.

Laten we er een paar bekijken.

6.1. Invoer

Om alle importen weer te geven die in de huidige sessie actief zijn, kunnen we de /importeren opdracht:

jshell> / import | importeer java.io. * | importeer java.math. * | importeer java.net. * | importeer java.nio.file. * | importeer java.util. * | importeer java.util.concurrent. * | importeer java.util.function. * | importeer java.util.prefs. * | importeer java.util.regex. * | importeer java.util.stream. *

Zoals we kunnen zien, begint de shell met een flink aantal nuttige importen die al zijn toegevoegd.

6.2. Lijsten

Werken in een REPL is lang niet zo eenvoudig als het hebben van een complete IDE binnen handbereik: het is gemakkelijk om te vergeten welke variabelen welke waarden hebben, welke methoden zijn gedefinieerd, enzovoort. Om de staat van de shell te controleren kunnen we gebruiken / var, / methoden, /lijst of /geschiedenis:

jshell> / var | int ik = 0 | String company = "Baeldung" | Datum datum = zo 26 februari 06:30:16 EST 2017 | Bestand bestand = null | String $ 6 = "100 flessen bier aan de muur" jshell> / methodes | void helloWorld () jshell> / list 1: void helloWorld () {System.out.println ("Hallo wereld");} 2: int i = 0; 3: String company = "Baeldung"; 4: Datum datum = nieuwe datum (); 5: Bestandsbestand; 6: String.format ("% d flessen bier aan de muur", 100) jshell> / history void helloWorld () {System.out.println ("Hallo wereld");} int i = 0; String company = "Baeldung" Datum datum = nieuw Datum () Bestandsbestand String.format ("% d flessen bier aan de muur", 100) / var / methodes / list / history 

Het verschil tussen /lijst en /geschiedenis is dat de laatste commando's toont naast uitdrukkingen.

6.3. Besparing

Om de expressiehistorie op te slaan, moet het /sparen commando kan worden gebruikt:

jshell> / save repl.java 

Dit slaat onze expressiegeschiedenis op in repl.java in dezelfde map van waaruit we het jshell opdracht.

6.4. Bezig met laden

Om een ​​eerder opgeslagen bestand te laden, kunnen we de /Open opdracht:

jshell> / open repl.java 

Een geladen sessie kan vervolgens worden geverifieerd door uit te geven / var, /methode of /lijst.

6.5. Afsluiten

Als we klaar zijn met het werk, wordt de /Uitgang commando kan de shell beëindigen:

jshell> / exit | Vaarwel

Vaarwel jshell.

7. Conclusie

In dit artikel hebben we Java 9 REPL onder de loep genomen. Aangezien Java al meer dan 20 jaar bestaat, is het misschien wat laat aangekomen. Het zou echter een ander waardevol hulpmiddel in onze Java-toolbox moeten blijken te zijn.