Welche Vorteile bietet main (...) bietet über einen statischen-initializer als Pseudo-Entry-Punkt mit?

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

Frage

Der Einstiegspunkt in ein Programm in Java ist in der Regel so etwas wie diese


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

Da es jedoch nur die eine SOP in Haupt ist, kann die obige Klasse wie folgt sein, anstatt


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

Ein offensichtlicher Vorteil der Verwendung von main (...) ist, dass Argumente an das Programm übergeben werden können. Weitere (Ich vermute hier) mit dem Müll collecter zu tun hat, die Behandlung von Objekten innerhalb eines statischen Block unterschiedlich erstellt.

Welche anderen Vorteile kommen aus der Verwendung der Sprache definierten Einstiegspunkt -. Public static void main (String args []) anstelle einer statischen Initialisierer von mit

P. S. Die oben genannten Schnipsel dienen nur zur Veranschaulichung und nicht übersetzbar sein

War es hilfreich?

Lösung

  • Sie können es testen oder es aus anderen Anwendungen aufrufen.
  • Es ist, was andere Leute erwarten.
  • Wenn Sie Ihre gesamte Anwendung im Rahmen eines statischen Initialisierer ausführen, I verdächtigen Sie effektiv auf diese Art eine Sperre hält die ganze Zeit werde. Wenn irgendein anderer Thread eine statische Methode in der gleichen Klasse zu nennen versucht, wird es blockieren. Das ist die Art von Problem, das Sie erhalten, wenn Sie versuchen, ein Konzept auf unerwartete Weise zu nutzen - es ist nur konzeptionell „falsch“. die Klasse Initialisierung ist einfach nicht das gleiche wie eine Anwendung ausgeführt wird.

EDIT: Hier ist ein Beispiel für dieses Problem:

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!");
        }
    }
}

Ausgabe:

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

Beachten Sie, wie der Anruf von dem neuen Thread someStaticMethod muss warten, bis die statische Initialisierung beendet hat, bevor es ausgeführt wird.

Andere Tipps

können Sie rufen main() für andere Objekte von überall sonst in Ihrem Code so oft wie Sie wollen. Eine statische Initialisierer wird immer nur einmal ausführen. Außerdem können Sie die Parameter in der Befehlszeile in main() passieren.

Zwei großer plusses für main() in meinem Buch.

Der Hauptgrund, warum es besser ist, main() zu verwenden ist, dass Sie mehr wichtigsten Methoden in Ihrer Anwendung haben können (in verschiedenen Klassen). Wenn Sie eine Klasse laden, wird main() nicht automatisch während static Codeblocks ausgeführt werden immer genau einmal beim ersten Mal einer Klasse ausgeführt wird, geladen und es gibt keine Möglichkeit, das zu verhindern.

OK, ich gebe zu, dass ich es nicht mit einer statischen initialisiert Klasse versucht habe, würde aber nicht die Eingabe

java StaticInitializedClass

auf der Kommandozeile drucken

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

, da es keine main(String[]) Methode hat?

Lassen Sie sich nicht über die Wartbarkeit vergessen. Wenn jemand anderes geht, Ihren Code zu ändern, sie gehen immer für eine Methode main () zu sehen, das Programm zu starten. Es sei denn, es aus irgendeinem Grund ist, können Sie nicht umgehen (und ich vermute, es ist nicht), dann würde ich nur die Haupt-Methode verwenden.

Wenn Sie keinen Einstiegspunkt haben, können Sie nichts laufen. Wenn Sie viele Einstiegspunkte (viele Haupt Methoden) haben, Benutzer, startet die Anwendung steuert, die von der Kommandozeile ausführen wird.
Auf der anderen Seite statische Initialisierungsblöcke ausgeführt werden, wenn Klasse geladen wird. Controlling, die Klasse geladen wird und die Reihenfolge der Klassenlade (und deren statische Initialisierung Blöcke ausgeführt wird), ist viel schwieriger zu kontrollieren. Das ist Grund genug, nicht zu viel Logik statische Initialisierungsblöcke zu setzen. Sie machen etwas schwieriger zu lesen und zu verstehen, und in Lohn erhalten Sie etwas härter zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top