EN · DE · RU · FR · ES

#802: AbstractAggregatedValues.java

projectforge-business/src/main/java/org/projectforge/statistics/AbstractAggregatedValues.java Classe de base abstraite, projectforge-business/src/main/java/org/projectforge/statistics/AbstractAggregatedValues.java 146 lignes · 85 code · 43 commentaires · 18 vides

Classe de base d'agrégation statistique

Une classe de base abstraite générique pour accumuler des valeurs agrégées dans le temps. Utilisée par le module de statistiques et spécifiquement par LiquidityForecast pour les calculs de délais de paiement pondérés. Les sous-classes (IntAggregatedValues, BigDecimalAggregatedValues) fournissent des implémentations spécifiques aux types.

Le paramètre générique <T> permet d'effectuer des opérations arithmétiques sur n'importe quel type numérique sans duplication de code. La classe stocke deux LinkedList parallèles — une pour les valeurs, une pour les poids — permettant à la fois des moyennes simples et des moyennes pondérées sur le même ensemble de données.

Patron de méthode template

La classe implémente le patron Template Method. Les algorithmes principaux (getAverage(), getWeightedAverage()) sont définis dans la classe abstraite, tandis que l'arithmétique spécifique au type est déléguée aux sous-classes via six méthodes abstraites :

Méthode abstraiteObjectif
getZero()Retourne l'élément neutre additif pour le type T (ex. 0 ou BigDecimal.ZERO)
sum(T, T)Additionne deux valeurs de type T
convert(int)Convertit un compte int en type T pour la division
divide(T, T)Divise la somme par le compte/poids
multiply(T, T)Multiplie la valeur par le poids (pour la moyenne pondérée)
isZero(T)Vérifie si une valeur est zéro (protège contre la division par zéro)

Mise en cache par indicateur de modification (dirty flag)

Les résultats de average et weightedAverage sont calculés paresseusement et mis en cache à l'aide d'un indicateur de modification. Deux champs booléens (averageDirty, weightedAverageDirty) suivent si la valeur en cache est obsolète. L'appel à add() définit les deux indicateurs à true. Les valeurs en cache ne sont recalculées que lorsque getAverage() ou getWeightedAverage() est appelé et que l'indicateur correspondant est défini.

Cette optimisation évite de recalculer les moyennes à chaque ajout, ce qui est important lorsque de nombreuses valeurs sont ajoutées en séquence avant que la moyenne ne soit demandée.

API fluide (chaînage de méthodes)

Les surcharges de add() et clear() retournent this, permettant un chaînage fluide :

aggregatedValues.add(val1).add(val2, weight2).add(val3).getWeightedAverage();

Contexte d'utilisation : LiquidityForecast

Dans LiquidityForecast, cette classe est utilisée pour calculer le délai de paiement moyen pondéré sur plusieurs positions de facture. Chaque position apporte une valeur (montant) et un poids (jours jusqu'au paiement). La moyenne pondérée donne un délai de paiement représentatif unique pour la prévision.

Historique Git

868d6abb7 2025 -> 2026
63081666f En-têtes des fichiers source : 2024 -> 2025.
b6092df09 Copyright 2023 -> 2024
ab45d51fa Copyright 2001-2022 -> 2001-2023.
5f7ef41b8 Copyright 2021 -> 2022
ceb63e8a1 En-tête du code source : (C) 2001-2021.
7c79f1922 Copyright de l'en-tête source -> 2020.
73a9755df Nettoyage de code : blocs catch réduits, opérateur diamant, StringBuilder, list.sort
000ca723d Suppression des expressions booléennes inutiles (business)
dd5ca38ac Copyright de tous les en-têtes de fichiers Java mis à jour ou créés.