[JAVA] Lassen Sie uns EAM implementieren

Vorwort

Ich habe diesen Artikel geschrieben, weil ich dachte, ich brauche etwas zum Lesen und Schreiben von Dateien, um eine neue Sprache zu erstellen. Es ist sehr vielseitig, also wenden Sie es bitte auf etwas an.

Was ist EAM?

EAM ist eine Abkürzung für ** Execute Around Method **, was bedeutet, dass vor und nach einer Methode Speicher zugewiesen oder freigegeben wird. Insbesondere bei Verwendung externer Ressourcen (z. B. E / A) reicht der Garbage Collector (GC) allein nicht aus, und Sie müssen die Ressource schließen (z. B. close () von FileWriter). Es ist schwer in Worten zu verstehen, also schauen wir uns die Implementierung an.

Warum EAM ohne Try-with-Resources oder ARM implementieren?

Funktionale Programmierung mit Java -Java8 Lambda-Ausdruck und Stream- Es ist ein Zitat aus `Die in Java 8 hinzugefügte Stream-Klasse implementiert AutoCloseable. (...) Infolgedessen wurde AutoCloseable in eine lockere Vereinbarung "Ressourcen können geschlossen werden" geändert, anstatt der vorherigen strengen "Ressourcen müssen geschlossen werden" -Vereinbarung. (...) Dieser Code, der ARM verwendet, ist sehr präzise und attraktiv, aber Entwickler sollten daran denken, ihn zu verwenden. Wenn Sie diese elegante Syntax ignorieren, achten Sie nicht auf Ihren Code. Wenn Sie jedoch nach einer Möglichkeit suchen, Ressourcen rechtzeitig freizugeben und Entwicklerfehler in einer Fehde zu vermeiden, sollten Sie ARMs verwenden Wir müssen weiter gehen. ``

Implementierung

EAM.java


import java.util.*;
import java.io.*;

public class EAM{
    private final FileReader fr;
    private EAM(final String s) throws IOException{
        fr = new FileReader(s);
    }
    public static void use(final String s,final Use<EAM,IOException> u) throws IOException{
        final EAM eam = new EAM(s);
        try{
            u.accept(eam);
       	}finally{
            eam.close();
       	}
    }
    private void close() throws IOException{
        System.out.println("close()");
        fr.close();
    }
    public void read(char[] c) throws IOException{
        fr.read(c);
    }
}

Obwohl es nur für Reader implementiert ist, ist es einfach, Writer zu implementieren.

Use.java


@FunctionalInterface
public interface Use<T,X extends Throwable>{
    void accept(T t) throws X;
}

Implementierungsbeschreibung

Ich habe den Konstruktor für den Fall privat gemacht, dass die Ressource außerhalb von use () geöffnet wird, obwohl ich versuche, die externe Ressource zu verwalten. Dadurch kann nur use () extern aufgerufen werden.

Lauf

Main.java


import java.io.*;
import java.util.*;

public class Main{
    public static void main(String[] args) throws IOException{
        char[] c = new char[100];
        EAM.use("eam.txt",eam -> eam.read(c));
        for(char aChar:c) System.out.print(aChar);
    }
}

Erstellen Sie eam.txt und geben Sie die Zeichenfolge ein oder geben Sie eine andere Datei an. Könnte die Zeichenfolge in der Datei gelesen werden? Wenn Sie Fragen haben, wenden Sie sich bitte.

Recommended Posts

Lassen Sie uns EAM implementieren
Lassen Sie uns Lexer (1) implementieren
Lassen Sie uns Lexer (2) implementieren