EN · DE · RU · FR · ES

#802: AbstractAggregatedValues.java

projectforge-business/src/main/java/org/projectforge/statistics/AbstractAggregatedValues.java Clase base abstracta, projectforge-business/src/main/java/org/projectforge/statistics/AbstractAggregatedValues.java 146 líneas · 85 código · 43 comentarios · 18 en blanco

Clase base de agregación estadística

Una clase base abstracta genérica para acumular valores agregados a lo largo del tiempo. Utilizada por el módulo de estadísticas y específicamente por LiquidityForecast para cálculos de tiempo de pago promedio ponderado. Las subclases (IntAggregatedValues, BigDecimalAggregatedValues) proporcionan implementaciones específicas de tipo.

El parámetro genérico <T> permite operaciones aritméticas en cualquier tipo numérico sin duplicación de código. La clase almacena dos LinkedList paralelas — una para valores, otra para pesos — permitiendo tanto promedios simples como promedios ponderados sobre el mismo conjunto de datos.

Patrón de método plantilla

La clase implementa el patrón Método Plantilla. Los algoritmos centrales (getAverage(), getWeightedAverage()) se definen en la clase abstracta, mientras que la aritmética específica de tipo se delega a las subclases mediante seis métodos abstractos:

Método abstractoPropósito
getZero()Devuelve la identidad aditiva para el tipo T (ej. 0 o BigDecimal.ZERO)
sum(T, T)Suma dos valores de tipo T
convert(int)Convierte un conteo int al tipo T para división
divide(T, T)Divide la suma por el conteo/peso
multiply(T, T)Multiplica el valor por el peso (para promedio ponderado)
isZero(T)Verifica si un valor es cero (protege contra división por cero)

Almacenamiento en caché con bandera de suciedad

Tanto los resultados de average como de weightedAverage se calculan de forma diferida y se almacenan en caché utilizando un patrón de bandera de suciedad. Dos campos booleanos (averageDirty, weightedAverageDirty) rastrean si el valor en caché está obsoleto. Llamar a add() establece ambas banderas de suciedad a true. Los valores en caché solo se recalculan cuando se llama a getAverage() o getWeightedAverage() y la bandera de suciedad respectiva está establecida.

Esta optimización evita recalcular promedios en cada adición, lo cual es importante cuando se agregan muchos valores en secuencia antes de consultar el promedio.

API fluida (encadenamiento de métodos)

Ambas sobrecargas de add() y clear() devuelven this, permitiendo encadenamiento fluido:

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

Contexto de uso: LiquidityForecast

En LiquidityForecast, esta clase se utiliza para calcular el tiempo de pago promedio ponderado en múltiples posiciones de factura. Cada posición contribuye con un valor (monto) y un peso (días hasta el pago). El promedio ponderado produce un único tiempo de pago representativo para la previsión.

Historial de Git

868d6abb7 2025 -> 2026
63081666f Encabezados de archivos fuente: 2024 -> 2025.
b6092df09 Derechos de autor 2023 -> 2024
ab45d51fa Derechos de autor 2001-2022 -> 2001-2023.
5f7ef41b8 Derechos de autor 2021 -> 2022
ceb63e8a1 Encabezado de código fuente: (C) 2001-2021.
7c79f1922 Derechos de autor del encabezado fuente -> 2020.
73a9755df Limpieza de código: bloques catch colapsados, operador diamante, StringBuilder, list.sort
000ca723d Eliminar expresiones booleanas sin sentido (negocio)
dd5ca38ac Derechos de autor de todos los encabezados de archivos Java actualizados o creados.