[JAVA] Implémentons EAM

Préface

J'ai écrit cet article parce que je pensais avoir besoin de quelque chose pour lire et écrire des fichiers pour créer un nouveau langage. C'est très polyvalent, alors appliquez-le à quelque chose.

Qu'est-ce que EAM

EAM est une abréviation de ** Execute Around Method **, qui signifie allouer ou libérer de la mémoire avant et après une méthode. En particulier, lors de l'utilisation de ressources externes (telles que IO), le garbage collector (GC) seul ne suffit pas et vous devez fermer la ressource (comme close () de FileWriter). C'est difficile à comprendre avec des mots, alors jetons un coup d'œil à l'implémentation.

Pourquoi implémenter EAM sans try-with-resources ou ARM

Programmation fonctionnelle avec Java -Expression lambda Java8 et Stream- C'est une citation de `La classe Stream ajoutée dans Java 8 implémente AutoCloseable. (...) En conséquence, AutoCloseable a été changé pour un accord plus lâche "les ressources peuvent être fermées" au lieu du précédent strict "les ressources doivent être fermées". (...) Ce code qui utilise ARM est très concis et attrayant, mais les développeurs doivent se rappeler de l'utiliser. Ignorer cette syntaxe élégante ne fait pas attention à votre code ... mais si vous cherchez un moyen de libérer des ressources en temps opportun et d'éviter les erreurs de développeur dans une querelle, ARM's Il faut aller plus loin. ''

la mise en oeuvre

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

Bien qu'il ne soit implémenté que pour Reader, il est facile d'implémenter Writer.

Use.java


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

Description de la mise en œuvre

J'ai rendu le constructeur privé au cas où la ressource serait ouverte en dehors de use () même si j'essaie de gérer la ressource externe. Cela permet uniquement d'appeler use () en externe. --Description de EAM.java

Courir

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

Créez eam.txt et saisissez la chaîne ou spécifiez un autre fichier. La chaîne de caractères du fichier peut-elle être lue? Si vous avez des questions, n'hésitez pas à demander.

Recommended Posts

Implémentons EAM
Implémentons Lexer (1)
Implémentons Lexer (2)