[JAVA] Road to REPL (?) Création (2)

introduction

C'est la deuxième fois que vous créez REPL pour Java 8. Veuillez vous référer au premier article pour le but et les précautions.

Passons maintenant à la description de la source.

Interface de la console

Une interface qui permet d'accéder aux consoles Windows cmd et Eclipse.

interface Interface { ... }Ce n'est pas une erreur, mais une interface factice.


 La création d'une petite interface en tant que fichier unique complique le système de fichiers, nous allons donc y ajouter une interface.


#### **`Interface.java`**
```java

package console;

interface Interface {
    /** console interface. */
    interface Console extends Interface.Finalizable {
        // methods for input string from console ======================================
        default String input(String prompt);

        // methods for output string to console =======================================
        void print(String format, Object... args);
        void print(String s);

        // extends Inteeface.Finalizeable =============================================
        void cleanup();
    }
    // ... more interface ...
}

Service de console

Ce fichier est également compressé ... La classe de console concrète est simplement créée et passée par `` Console.create () ''.

Service.java


package console;

public interface Service {
    class Console {
        public  static final String newLine = System.lineSeparator();
        private static final String defaultEncoding = "UTF-8";

        public  static Interface.Console create(String encoding) {
            if ( encoding == null  ||  encoding.trim().isEmpty() ) { 
                encoding = defaultEncoding; 
            }
            if ( !java.nio.charset.Charset.isSupported(encoding) ) {
                encoding = defaultEncoding; 
            }
            return    (System.console() != null)
                    ? new SystemConsole(System.console())
                    : new StandardConsole(encoding);
        }

        // ///////////////////////////////////////////////////////////////////////////////
        /** console uses standard in/out class.
         */ // ///////////////////////////////////////////////////////////////////////////
        private static class StandardConsole implements Interface.Console {
            protected StandardConsole(String encoding) {
                try {
                    java.io.InputStreamReader istream = new java.io.InputStreamReader(System.in, encoding);
                    reader_  = new java.io.BufferedReader(istream);
                    out_     = new java.io.PrintStream(System.out, true, encoding);
                } catch (java.io.IOException e) {
                    System.out.println( e.getMessage() );
                }
            }

            // methods for input string from console ===============================
            public String input(String prompt) {
                out_.printf(prompt);
                String s = "";
                try {
                    s = reader_.readLine();
                } catch (java.io.IOException e) {
                    System.out.println( e.getMEssage() );
                }
                return s;
            }

            // methods for output string to console ================================
            public void print(String format, Object... args) { out_.printf(format, args); }
            public void print(String s)                      { out_.println(s);           }

            // implements Finalizable.cleanup() ====================================
            public void cleanup() {
                out_.close();
                out_ = null;
                try {
                    reader_.close();
                    reader_ = null;
                } catch(java.io.IOException e) {
                    System.out.println( e.getMessage() );
                }
            }

            // internal fields =====================================================
            java.io.BufferedReader reader_;
            java.io.PrintStream    out_;
        }

        // ///////////////////////////////////////////////////////////////////////////////
        /** console uses System.console() class.
         */ // ///////////////////////////////////////////////////////////////////////////
        private static class SystemConsole implements Interface.Console {
            protected SystemConsole(java.io.Console con) {
                console_ = con;
            }

            // methods for input string from console ===============================
            public String input(String prompt) { return console_.readLine(prompt); }

            // methods for output string to console ================================
            public void print(String format, Object... args) {
               console_.printf(format, args); 
            }
            public void print(String s) {
                console_.printf(s + Service.Console.newLine); 
            }

            // implements Finalizable.cleanup() ====================================
            public void cleanup() { /* no operation */ }

            // internal fields =====================================================
            java.io.Console console_;
        }
    }
}

La description

Service.Console Bien qu'il dise service, il s'agit en fait d'une classe d'usine de console. Prend le nom d'encodage de la console et génère et retourne une classe de console concrète basée sur celui-ci. Si un nom de codage incorrect est transmis, la valeur par défaut "UTF-8" est définie.

python


public interface Service {
    class Console {
        public  static final String newLine = System.lineSeparator();
        private static final String defaultEncoding = "UTF-8";

        public  static Interface.Console create(String encoding) {
            if ( encoding == null  ||  encoding.trim().isEmpty() ) { 
                encoding = defaultEncoding; 
            }
            if ( !java.nio.charset.Charset.isSupported(encoding) ) {
                encoding = defaultEncoding; 
            }
            return    (System.console() != null)
                    ? new SystemConsole(System.console())
                    : new StandardConsole(encoding);
        }
        // ... inner class ...
}

SystemConsole Il s'agit d'une classe de console qui utilise System.Console. Je pense qu'aucune explication particulière n'est nécessaire car le traitement est simplement délégué. Dans le Service.Console ci-dessus, j'essaie de vérifier l'encodage, mais ici je ne l'utiliserai pas car l'encodage réellement utilisé dans la console (cmd.exe etc.) est initialisé ( Apparemment, il ne semble y avoir aucun moyen de le changer).

python


public interface Service {
    class Console {
        // ...réduction...

        // ///////////////////////////////////////////////////////////////////////////////
        /** console uses System.console() class.
         */ // ///////////////////////////////////////////////////////////////////////////
        private static class SystemConsole implements Interface.Console {
            protected SystemConsole(java.io.Console con) { console_ = con; }

            // methods for input string from console ===============================
            public String input(String prompt) { return console_.readLine(prompt); }

            // methods for output string to console ================================
            public void print(String format, Object... args) {
               console_.printf(format, args); 
            }
            public void print(String s) {
                console_.printf(s + Service.Console.newLine); 
            }

            // implements Finalizable.cleanup() ====================================
            public void cleanup() { /* no operation */ }

            // internal fields =====================================================
            java.io.Console console_;
        }
    }
}

StandardinConsole Il s'agit d'une classe de console qui utilise des E / S standard. Je fais juste la même chose que SystemConsole, mais grâce à la plaque chauffante, la quantité de code est doublée. Même dans ce cas, la quantité de description est réduite car la vérification du codage est effectuée en usine.

python


public interface Service {
    class Console {
        // ...réduction...

        // ///////////////////////////////////////////////////////////////////////////////
        /** console uses standard in/out class.
         */ // ///////////////////////////////////////////////////////////////////////////
        private static class StandardConsole implements Interface.Console {
            protected StandardConsole(String encoding) {
                try {
                    java.io.InputStreamReader istream = new java.io.InputStreamReader(System.in, encoding);
                    reader_  = new java.io.BufferedReader(istream);
                    out_     = new java.io.PrintStream(System.out, true, encoding);
                } catch (java.io.IOException e) {
                    System.out.println( e.getMessage() );
                }
            }

            // methods for input string from console ===============================
            public String input(String prompt) {
                out_.printf(prompt);
                String s = "";
                try {
                    s = reader_.readLine();
                } catch (java.io.IOException e) {
                    System.out.println( e.getMessage() );
                }
                return s;
            }

            // methods for output string to console ================================
            public void print(String format, Object... args) { out_.printf(format, args); }
            public void print(String s)                      { out_.println(s);           }

            // implements Finalizable.cleanup() ====================================
            public void cleanup() {
                out_.close();
                out_ = null;
                try {
                    reader_.close();
                    reader_ = null;
                } catch(java.io.IOException e) {
                    System.out.println( e.getMessage() );
                }
            }

            // internal fields =====================================================
            java.io.BufferedReader    reader_;
            java.io.PrintStream       out_;
    }
}

Correction de BaseREPL

Le BaseREPL précédent est également modifié car vous devez transmettre le nom de l'encodage. Ici, seules les parties corrigées sont décrites. Voir l'article précédent (https://qiita.com/KG_dash/items/d44e5521594c4107fc8a) pour le code complet.

BaseREPL.java


class BaseREPL {
    BaseREPL(String encoding) {
        if ( encoding == null  ||  encoding.trim().isEmpty() ) { encoding = "UTF-8"; }
        console_ = Service.Console.create(encoding);
    }
    // ...Omis en chemin...
    // internal fields =============================================================
    protected final Interface.Console console_;
}

Résumé

Cette fois, j'ai expliqué la console utilisée par REPL. Au départ, il était compact, mais pendant que je le réparais, il est devenu un volume décent.

Encore quelques fois, nous continuerons à créer des classes à inclure dans REPL.

Recommended Posts

Road to REPL (?) Création (3)
Road to REPL (?) Création (1)
Road to REPL (?) Création (2)
La voie de la création de services Web (partie 2)
19 Correspond à la création d'objet
En route vers l'acquisition de Java SE 11 Silver
La route de JavaScript à Java
à_ ○
La route pour créer un jeu sonore 2
Java SE8 Silver ~ La route à franchir ~
Introduction à kotlin pour les développeurs iOS ⑥ ー création de kotlin
La route pour créer un jeu sonore 3
La route pour créer un jeu sonore 1