Método main() no estático

Desde la versión 21 de Java se pueden crear métodos main() no estáticos para ejecutar nuestros programas. El objetivo principal es mejorar el protocolo de lanzamiento de programas Java para permitir métodos main() de instancia: métodos que no son static, no necesitan ser public, ni la clase ni el método y no necesitan el parámetro String[].

Esta característica fue introducida como preview en Java 21 y finalizada en Java 25.

En su forma mínima, podemos crear un método main() sin static ni public y sin pedir el parámetro String[].

class Saludo {
    void main() {
        System.out.println("Hola desde un método de instancia");
    }
}

Guarda el código anterior en un fichero llamado Saludo.java. Observa que la clase no la hemos declarado public. Tampoco hemos declarado public ni static el método main(), ni hemos puesto argumentos String[].

Para compilar:

javac Saludo.java

Para ejecutar, si utilizas Java 21, tendrás que indicar a la JVM que utilice las características en preview:

java --enable-preview Saludo

En cambio, si utilizas Java 25, no será necesario hacer ninguna indicación:

java Saludo

Esta ha sido la salida en mi ordenador utilizando Java 21:

Utilizando Java 25:

¿Por qué se introdujo esto?

La motivación principal es pedagógica: static no solo es misterioso para los principiantes, sino perjudicial. Para añadir más métodos que main() pueda llamar, el estudiante debe declarar todo como static (propagando un idioma poco habitual) o enfrentarse a la diferencia entre miembros estáticos y de instancia antes de haber aprendido variables y flujo de control.

Clase con miembros de instancia

Observa que, al no ser estático el método main(), puede utilizar atributos y métodos de instancia, sin necesidad de que sean static. Los podremos utilizar desde dentro de main() con total normalidad. Prueba con el siguiente código:

class Calculadora {
    int base = 10;   // campo de instancia, accesible desde main

    void main() {
        System.out.println("Base: " + base);
        System.out.println("Doble: " + doble(base));
    }

    int doble(int n) {
        return n * 2;
    }
}

Puedes compilar con normalidad pero, para ejecutar, tendrás que tomar las mismas precauciones que en el caso anterior si utilizas Java 21. La salida en mi ordenador con Java 25:

Clase con parámetros de entrada

También podrías utilizar parámetros de entrada. Prueba el siguiente código:

class App {
    void main(String[] args) {
        System.out.println("Argumentos: " + args.length);
    }
}

Como en los ejemplos anteriores, si ejecutas en Java 21 tendrías que añadir –enable-preview. En Java 25, no sería necesario:

Método main(), sin clase (clases implícitas)

Podemos ir un paso más allá. Podemos utilizar directamente el método main(), sin necesitad de que esté incluido en ninguna clase. Esta característica se denomina unnamed classes o también clases implícitas. Prueba el siguiente código dentro de un fichero llamado, por ejemplo, MiClaseImplicita.java :

// Sin declaración de clase. Requiere --enable-preview en javac 21
void main() {
    System.out.println("Hola");
}

Una diferencia con los ejemplos anteriores es que ahora, si compilas con Java 21, también tendrás que añadir el parámetro –enable-preview. En Java 25 no es necesario:

Como puedes ver, las nuevas versiones de Java ofrecen opciones interesantes que merece la pena explorar. Eso sí, ¡no utilices estas opciones en los exámenes de la asignatura, pues podrías suspender! 🤣

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *