Quali sono i vantaggi principali (...) fornire oltre utilizzando una statica inizializzatore come un entry-point pseudo?

StackOverflow https://stackoverflow.com/questions/1298342

Domanda

Il punto di ingresso in un programma in Java è in genere qualcosa di simile


    // MyMain.java
    public class MyMain{  
      //whatever 
        public static void main(String args[]){ 
        System.out.println("balderdash");
        }
    }

Tuttavia, poiché non v'è solo quella SOP nella principale, la classe di cui sopra può essere come questo, invece


    // MyMain.java
    public class MyMain{
        //whatever
        static {    
        System.out.println("balderdash");
        }
    }

Un evidente vantaggio di utilizzare principale (...) è che gli argomenti possono essere passati al programma. Un altro (sto cercando di indovinare qui) possono avere a che fare con la spazzatura collecter trattare gli oggetti creati all'interno di un blocco statico in modo diverso.

Quali altri benefici provengono da utilizzando l'entry-point linguaggio definito -. Static void main (String args []) pubblici invece di utilizzare un inizializzatore statico

P.S. I frammenti di cui sopra sono solo per illustrazione, e non può essere compilabile

È stato utile?

Soluzione

  • È possibile verificare o chiamare da altre applicazioni.
  • E 'quello che gli altri si aspettano.
  • Se si esegue tutta l'applicazione nel contesto di un inizializzatore statico, I sospettato ti efficacemente essere tenuta un blocco su che tipo per tutto il tempo. Se qualsiasi altro thread tenta di chiamare un metodo statico nella stessa classe, bloccherà. Questo è il tipo di problema che si ottiene quando si tenta di utilizzare un concetto in modo inaspettato - è solo concettualmente "sbagliato". L'inizializzazione della classe semplicemente non è lo stesso che l'esecuzione di un'applicazione.

EDIT: Ecco un esempio di questo problema:

class SampleTask implements Runnable
{
    public void run()
    {
        System.out.println("Calling someStaticMethod");
        Test.someStaticMethod();
        System.out.println("someStaticMethod returned");
    }
}

public class Test
{
    static
    {
        System.out.println("Starting new thread...");
        new Thread(new SampleTask()).start();
        System.out.println("Thread started. Sleeping");
        try
        {
            Thread.sleep(5000);
        }
        catch (InterruptedException e)
        {
            System.out.println("Interrupted!");
        }
        System.out.println("Finished sleeping");          
    }

    public static void someStaticMethod()
    {
        System.out.println("In someStaticMethod");
    }

    public static void main(String[] args)
    {
        System.out.println("In main. Sleeping again.");
        try
        {
            Thread.sleep(5000);
        }
        catch (InterruptedException e)
        {
            System.out.println("Interrupted!");
        }
    }
}

Output:

Starting new thread...
Thread started. Sleeping
Calling someStaticMethod
Finished sleeping
In someStaticMethod
someStaticMethod returned
In main. Sleeping again.

Si noti come la chiamata alla someStaticMethod dal nuovo thread deve aspettare fino a quando l'inizializzatore statico è terminata prima che arrivi a correre.

Altri suggerimenti

È possibile chiamare main() per altri oggetti da qualsiasi altro luogo nel codice tutte le volte che si vuole. Un inizializzatore statico è solo andare a correre mai una volta. Inoltre, è possibile passare i parametri da linea di comando in main().

Due corrono lungo per main() nel mio libro.

Il motivo principale per cui è meglio utilizzare main() è che si può avere diversi metodi principali nell'applicazione (in classi diverse). Se si carica una classe, main() non viene eseguito automaticamente, mentre i blocchi di codice static sono sempre eseguiti esattamente una volta alla prima volta una classe viene caricato e non c'è modo di evitare che.

OK, devo ammettere che non ho provato con una classe inizializzata statica, ma non sarebbe la digitazione

java StaticInitializedClass

sulla riga di comando stampare

Exception in thread "main" java.lang.NoSuchMethodError: main

in quanto non dispone di un metodo main(String[])?

Non dimentichiamo circa manutenibilità. Quando qualcuno va a modificare il codice che stanno andando sempre alla ricerca di un metodo main () per avviare il programma. A meno che non ci sia qualche motivo non si può andare in giro (e sto cercando di indovinare, non c'è), allora vorrei solo utilizzare il metodo principale.

Se non si dispone di alcun punto di ingresso, non è possibile eseguire nulla. Se si dispone di molti punti di ingresso (molti metodi principali), utente che avvia i controlli applicativi che sarà gestito da riga di comando.
D'altra parte i blocchi di inizializzazione statica vengono eseguiti quando viene caricata classe. Controllare quali classe viene caricata e l'ordine di classe di carico (e di eseguire loro blocchi di inizializzazione statica) è molto più difficile da controllare. Questa è una ragione sufficiente per non mettere a molto logica per blocchi di inizializzazione statico. Fate qualcosa di più difficile da leggere e capire, in ricompensa di ricevere qualcosa di più difficile da usare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top