¿Por qué es Java.Time.Year arbitrariamente limitada a menos que sus límites primitivos?

Anthony Mansour:

La página del documento de Java 8 para Java.Time.Year establece que el mínimo y el máximo soportado años son -999 999 999 y 999 999 999, respectivamente.

Campo Resumen

static int MAX_VALUEEl año máxima admitida, '999999999'.

static int MIN_VALUEEl mínimo soportado años, '-999 999 999'.


Sin embargo, la variable de tipo primitivo que almacena el valor años es un int , que debe ser capaz de almacenar entre -2147483648 y 2147483647.

/**
 * The year being represented.
 */
private final int year;

¿Por qué hay estos límites arbitrarios?

Brújula :

La razón 999.999.999 se utiliza no está vinculado a una cuestión específica con el análisis de la implementación dentro del código.

Es probable que haya sido seleccionado, ya que es el valor máximo de cualquier número que consta de entre 1 y 9 dígitos. No podemos almacenar una serie completa de los años 10 dígitos con un INT, como 9999999999 (y francamente otro 79% de los posibles números de 10 dígitos) no se pueden almacenar en un número entero. Es importante señalar que el formateador en sí mismo puede apoyar a los números individuales de hasta 64 dígitos sin problemas, y sólo utiliza MIN / MAX para la comprobación de errores. Si el mínimo / máximo se eleva a INT_MIN y INT_MAX, seguiría funcionando sin problemas. Valores superiores a INT_MAX tirarían correctamente un error y evitar cualquier problema relacionado con desbordamiento de enteros, por lo que no hay preocupación con respecto a cualquier tipo de fallo de análisis.

    ISO_LOCAL_DATE = new DateTimeFormatterBuilder()
            .appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
            .appendLiteral('-')
            .appendValue(MONTH_OF_YEAR, 2)
            .appendLiteral('-')
            .appendValue(DAY_OF_MONTH, 2)
            .toFormatter(ResolverStyle.STRICT, IsoChronology.INSTANCE);

Año es o bien 4 números para tradicional ISO, es decir, 0-9999, o tiene una +/-, es decir, 999.999 para el año 999999.

Es de destacar que el formateador ISO_LOCAL_DATE acepta años 10 dígitos por defecto, excluyendo el signo +/-, por lo que un valor de 9876543210 es en realidad correctamente analizada, pero excede los valores aceptables para MAX_YEAR.

Text '+9876543210-10-31' could not be parsed: Invalid value for Year (valid values -999999999 - 999999999): 9876543210

Todo en el DateTimeFormatterBuilder soporta hasta 64 dígitos, analizar un dígito a la vez. Todos estos valores se analizan de forma segura como BigIntegers, y con cuidado multiplican por 10 como el índice se mueve hacia la derecha, y al finalizar se convierten y se almacenan en un contexto de análisis que consiste en nombres de campos y largos, a pesar de que los campos meses y días claramente se pueden almacenar como INTS. Estos son de nuevo más tarde convertirse en sus primitivas asociadas.

En términos prácticos, DateTimeFormatterBuilder definitivamente podría utilizar 2,147,483,647como un año válido min / max sin romperse.

En términos realistas, la descripción de "Java acepta cualquier valor del año hasta 9 dígitos" presenta una barrera de concreto donde no hay ninguna posibilidad de desbordamiento de enteros o confusión cuando de la adición de dos años juntos, y reduce cualquier cuadro de confusión potencial negro de por qué el año 2100 millones pero funciona 2200000000 pausas a un alto.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=175415&siteId=1
Recomendado
Clasificación