[JAVA] Weg zur REPL (?) Schöpfung (2)

Einführung

Dies ist das zweite Mal, dass REPL für Java 8 erstellt wird. Informationen zu Zweck und Vorsichtsmaßnahmen finden Sie im ersten Artikel.

Kommen wir nun zur Quellenbeschreibung.

Konsolenschnittstelle

Eine Schnittstelle, die Zugriff auf die Windows-Konsolen cmd und Eclipse bietet.

interface Interface { ... }Es ist kein Fehler, sondern eine Dummy-Schnittstelle.


 Das Erstellen einer kleinen Schnittstelle als einzelne Datei verkompliziert das Dateisystem, daher fügen wir ihm eine Schnittstelle hinzu.


#### **`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 ...
}

Konsolendienst

Diese Datei ist auch gepackt ... Die konkrete Konsolenklasse wird einfach erstellt und von `Console.create ()` übergeben.

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_;
        }
    }
}

Erläuterung

Service.Console Obwohl dort Service steht, handelt es sich tatsächlich um eine Werksklasse der Konsole. Nimmt den Codierungsnamen der Konsole und generiert eine darauf basierende konkrete Konsolenklasse und gibt diese zurück. Wenn ein falscher Codierungsname übergeben wird, wird der Standardwert "UTF-8" festgelegt.

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 Dies ist eine Konsolenklasse, die System.Console verwendet. Ich denke, dass keine besondere Erklärung notwendig ist, da die Verarbeitung einfach delegiert wird. In der obigen Service.Console versuche ich, die Codierung zu überprüfen, aber hier werde ich sie nicht verwenden, da die tatsächlich in der Konsole verwendete Codierung (cmd.exe usw.) initialisiert ist ( Anscheinend scheint es keine Möglichkeit zu geben, dies zu ändern.

python


public interface Service {
    class Console {
        // ...Kürzung...

        // ///////////////////////////////////////////////////////////////////////////////
        /** 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 Dies ist eine Konsolenklasse, die Standard-E / A verwendet. Ich mache genau das Gleiche wie SystemConsole, aber dank der Kesselplatte wird die Codemenge verdoppelt. Trotzdem wird der Umfang der Beschreibung reduziert, da die Codierungsprüfung im Werk durchgeführt wird.

python


public interface Service {
    class Console {
        // ...Kürzung...

        // ///////////////////////////////////////////////////////////////////////////////
        /** 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_;
    }
}

BaseREPL-Fix

Die vorherige BaseREPL wurde ebenfalls geändert, da Sie den Codierungsnamen übergeben müssen. Hier werden nur die korrigierten Teile beschrieben. Den vollständigen Code finden Sie unter Vorheriger Artikel.

BaseREPL.java


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

Zusammenfassung

Dieses Mal erklärte ich die von REPL verwendete Konsole. Anfangs war es kompakt, aber während ich es reparierte, wurde es ein anständiges Volumen.

Noch einige Male werden wir weiterhin Klassen erstellen, die in REPL aufgenommen werden sollen.

Recommended Posts

Weg zur REPL (?) Schöpfung (3)
Weg zur REPL (?) Schöpfung (1)
Weg zur REPL (?) Schöpfung (2)
Der Weg zum Erstellen eines Webdienstes (Teil 2)
19 Entspricht der Objekterstellung
Straße nach Java SE 11 Silberakquisition
Der Weg von JavaScript nach Java
to_ ○
Der Weg zur Erstellung eines Soundspiels 2
Java SE8 Silber ~ Der Weg zum Pass ~
Einführung in Kotlin für iOS-Entwickler lin ー Kotlin-Erstellung
Der Weg zur Erstellung eines Soundspiels 3
Der Weg zur Erstellung eines Soundspiels 1