tipos que nombres long ejemplos ejemplo declarar datos java arguments minimum variadic-functions

que - tipos de variables en java ejemplos



Requerir al menos un elemento en la lista de argumentos de variable java (7)

En esta construcción de código:

public MyClass(Integer... numbers) { do_something_with(numbers[]); }

¿Es posible requerir que los numbers contengan al menos una entrada de tal manera, que esto se verifique en tiempo de compilación? (En tiempo de ejecución, por supuesto, solo puedo verificar los números.longitud).

Claramente podría hacer esto:

public MyClass(Integer number, Integer... more_numbers) { do_something_with(number, more_numbers[]); }

Pero esto no va a ser muy elegante.

La razón por la que me gustaría hacer esto es para asegurarme de que una subclase no se olvide simplemente de llamar a este constructor, lo que por defecto llamará a super() sin números en la lista. En este caso, me gustaría recibir el mensaje de error familiar: el Implicit super constructor is undefined. Must explicitly invoke another constructor Implicit super constructor is undefined. Must explicitly invoke another constructor .

¿Podría haber otra manera de lograr lo mismo, como alguna anotación @ que marca este constructor como no implícito?


Como se indica en los comentarios, no, no parece posible forzar que una var arg sea al menos de tamaño 1.

El único arreglo de tiempo de compilación que se me ocurre es simplemente requerir una matriz ( Integer[] ) como argumento para el constructor. Las subclases aún podrían tomar una var arg en su constructor y cualquier otro usuario de la clase simplemente tendría que crear una matriz a partir de los argumentos deseados antes de llamar al constructor.


Creo que el mejor enfoque para tener al menos 1 argumento es agregar uno como este:

public MyClass (int num, int... nums) { //Handle num and nums separately int total = num; for(i=0;i<nums.length;i++) { total += nums[i]; } //... }

Agregar un argumento del mismo tipo junto con varargs obligará al constructor a requerirlo (al menos un argumento). Entonces solo necesitas manejar tu primer argumento por separado.


Creo que no está en la clase ̶f̶u̶n̶c̶t̶i̶o̶n̶, pero cuando llamas a la clase ̶f̶u̶n̶c̶t̶i̶o̶n̶. Asegúrese de que su matriz tenga elementos antes de llamar a la clase ̶f̶u̶n̶c̶t̶i̶o̶n̶ con ella.


La única manera de validar es verifica los parámetros.

Valide los argumentos:

if (numbers == null || numbers.length == 0 ) { throw new IllegalArgumentException("Your angry message comes here"); }


Supongo que una forma increíblemente intrincada de hacerlo es crear un método sin argumentos y marcarlo como obsoleto. Luego compile con estos dos indicadores: -Xlint:deprecation -Werror . Esto hará que cualquier uso de un método en desuso sea un error de tiempo de compilación.


Una forma realmente pirata de hacerlo es crear una versión privada de ese método sin parámetros. Al menos, esto evitaría que alguien fuera de esta clase pase un parámetro en tiempo de compilación, pero no proporcionará un mensaje de error útil. Pero si es super importante, al menos se pasa un valor, eso lo hará así.

private MyClass() { // This exception will be thrown only if you manage to do a "new MyClass()" // within your own class since it is private. throw new RuntimeException("Why did you do this?!?"); }


public MyClass(boolean ignore, Integer... numbers) { do_something_with(numbers[]); }