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.
Une interface qui permet d'accéder aux consoles Windows cmd et Eclipse.
Interface pour accepter l'entrée de la console.
Print () '' `` Interface de méthode de sortie d'écran.cleanup ()
ʻInterface.Finalizable Interface aux méthodes de l'interface. 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 ...
}
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_;
}
}
}
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.
StandardConsole (String) '' `` Le nom d'encodage reçu par l'argument est défini dans BufferReader et PrintStream.`et retourner la chaîne reçue de`
BufferdReader.readLine () `` `, mais le code qui ne devrait prendre que deux lignes est gênant Notamment ... ~~ Ce genre d'endroit est ennuyeux et dégoûtant ~~
print () `` Il s'agit simplement d'un transfert vers PrintStream.
Cleanup () '' `` Interface.Implémentation finalisable de la méthode d'interface. Même si BufferdReader et PrintStream effectuent le même traitement, un seul nécessite une vérification des exceptions ... Un tel endroit (rypython
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_;
}
}
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_;
}
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