Supposons que vous souhaitiez déterminer si un jour est passé, présent ou futur, et divisez le processus en conséquence. Si cela est implémenté à l'aide de l'instruction if, le code sera le suivant. En fait, les perspectives ne sont pas si mauvaises à ce niveau, mais ** si vous voulez les décomposer davantage, vous devrez lire des branches complexes **.
Main.java
public static void main(String[] args) {	
    //variable:Je veux juger du système du temps passé
    LocalDate past =  LocalDate.of(2019, 10, 11);
    LocalDate today = LocalDate.now();  //Actuellement(2019-10-12)
        if(past.isBefore(today)) {
            System.out.println("Past");
        } 
        if(past.isEqual(today)) {
            System.out.println("Today");
        }
        if(past.isAfter(today)) {
	        System.out.println("After");
        }
    //production: Past
}
Tout d'abord, définissez les deux interfaces fonctionnelles suivantes dans le champ Enum (DatePattern).
Ensuite, ici, la méthode Factory est décrite comme la méthode de classe de () de Enum. La méthode Factory détermine le système de temps à partir de la date de réception en tant qu'argument, affecte le traitement en fonction de celui-ci et le renvoie comme valeur de retour.
De cette façon, vous pouvez écrire ** conditions et actions en tant que paramètres **.
DatePattern.java
public enum DatePattern {
    //(conditions,En traitement)paramètres de
    Past(date -> isBeforeToday(date), () -> System.out.println("Past")),
    Today(date -> isSameToday(date), () -> System.out.println("Today")),
    Future(date -> isAfterToday(date), () -> System.out.println("Future"));
    private final Predicate<LocalDate> dateValidator; //conditions
    private final Runnable function; //En traitement
    //Constructeur Enum
    DatePattern(Predicate<LocalDate> dateValidator, Runnable function) {
        this.dateValidator = dateValidator;
        this.function = function;
    }
    /* Factory Method 
     *Une condition qui définit la date locale de l'argument dans le champ(Predicate)À en juger par
     *En traitement(Runnnable)Rendre
    */ 
    public static Runnable of(LocalDate date) {
        Optional<Runnable> pattern = Stream.of(DatePattern.values())
                .filter(e -> e.dateValidator.test(date))
                .map(e -> e.function)
                .findFirst();
        return Optional.ofNullable(pattern.get()).orElseThrow(IllegalArgumentException::new);
    }
    //Jugement du passé
    private static boolean isBeforeToday(LocalDate date) {
        LocalDate today = LocalDate.now();
        return date.isAfter(today);
    }
    //Jugement du futur
    private static boolean isAfterToday(LocalDate date) {
        LocalDate today = LocalDate.now();
        return date.isBefore(today);
    }
    //Jugement de l'état actuel
    private static boolean isSameToday(LocalDate date) {
        LocalDate today = LocalDate.now();
        return date.equals(today);
    }    
}
Suite à l'utilisation de Enum, l'instruction if peut être supprimée comme suit. Puisqu'il n'y a pas de branchement conditionnel, nous avons pu améliorer les perspectives. De plus, l'ajout de conditions de jugement plus détaillées n'affecte pas l'appelant de ce DatePattern. Plutôt que de répéter le branchement conditionnel par instruction if les uns après les autres, je pense personnellement qu'il vaut mieux définir les conditions et le traitement dans un seul ensemble ** dans Enum, et cela améliorera la maintenabilité.
Main.java
public static void main(String[] args) {
    LocalDate past =  LocalDate.of(2019, 10, 11);  //passé
    LocalDate today = LocalDate.of(2019, 10, 12);  //Courant(2019-10-12)
    LocalDate future = LocalDate.of(2019, 10, 13); //futur
    Runnable past_function = DatePattern.of(past);
    Runnable today_function = DatePattern.of(today);
    Runnable futute_function = DatePattern.of(future);
    past_function.run();
    //production: Past
    today_function.run();
    //production: Today
    futute_function.run();
    //production: Future
}
        Recommended Posts