Warum ist eine statische Methode aus einer nicht-statischen Methode schlecht zugreifen?

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

  •  03-07-2019
  •  | 
  •  

Frage

Netbeans sagt mir, es ist schlecht eine statische Methode aus einer nicht statischen Methode zuzugreifen. Warum ist das schlecht? „Zugriff auf statische Methode getInstance“ ist die Warnung:

import java.util.Calendar;

public class Clock
{
    // Instance fields
    private Calendar time;

    /**
     * Constructor. Starts the clock at the current operating system time
     */
    public Clock()
    {
        System.out.println(getSystemTime());
    }

    private String getSystemTime()
    {
        return this.time.getInstance().get(Calendar.HOUR)+":"+
                this.time.getInstance().get(Calendar.MINUTE);
   }

}

War es hilfreich?

Lösung

Sie sind wahrscheinlich die statische Methode von einer Instanz zugreifen, anstatt direkt. Versuchen Sie es mit Calendar.getInstance() statt:

private String getSystemTime()
{
    return Calendar.getInstance().get(Calendar.HOUR)+":"+
           Calendar.getInstance().get(Calendar.MINUTE);
}

Andere Tipps

Was meinst du mit „einer statischen Methode zurückzukehren“? Es ist in Ordnung eine statische Methode von einer Instanz-Methode aus meiner Sicht zu nennen - je nach den Umständen, natürlich. Könnten Sie einige Code schreiben, die Netbeans beschwert sich über?

Eine Sache I könnte vorstellen, wenn Sie nur statische Methoden von einer Instanz-Methode verwenden, ohne dass die Daten der Instanz verwendet wird. Manchmal ist das, was erforderlich, um eine Schnittstelle zu implementieren, oder ein Verfahren von einer Basisklasse außer Kraft setzen, aber wenn Sie nichts überschreiben und Sie sind keine Instanzvariablen verwendet wird, ist es schön, die Methode statisch zu zeigen, dass es wirklich nicht abhängig von einer bestimmten Instanz.

EDIT: Mit der editierte Frage, das sehr viel Sinn macht. IMO ist es ein Mangel in Java, die es in erster Linie ermöglicht. Es kann sehr irreführend Code machen. Mein Lieblingsbeispiel (die Oldtimern meint es gut haben mich gesehen Post vor :) mit Thread.sleep ist. Was tut es aussehen wie dieser Code funktioniert?

Thread t = new Thread(someRunnable);
t.start();
t.sleep(1000);

Für mich sieht es aus wie der neue Thread zu schlafen gefragt wird - ähnlich wie bei einem Aufruf von suspend. Aber nein - können Sie nur bitten, die zur Zeit Thread zu schlafen Ausführung, weshalb Thread.sleep eine statische Methode ist. Der obige Code ist legal Java und wird den aktuell ausgeführten Thread Schlaf für eine Sekunde machen, während das neu erstellte Thread (wahrscheinlich) läuft ... gar nicht, was der Code wie auf den ersten Blick aussieht.

Haben Sie die Reihenfolge umgekehrt? Wenn ja, ist es sinnvoll, dass Sie nicht eine nicht-statische Methode aus einer statischen Methode zugreifen können. Wenn nicht, würde ich gerne wissen, warum das so gut ist schlecht!

Eine nicht-statische Methode kann nicht von einem statischen Kontext referenziert werden. Statische Methoden können aus einem nicht-statischen Kontext verwiesen werden.

Ist es ein Netbeans Fehler oder eine Warnung? Können Sie Code schreiben, die es verursacht?

Es ist ganz gut time.getInstance() zu nennen. Der Compiler wird auf die Art der Variablen suchen, Calendar in diesem Fall, und das Verfahren dort anrufen. Es endet genau wie Calendar.getInstance() zusammengestellt werden. Beachten Sie, dass der tatsächliche Wert von time nicht dazu beiträgt, das heißt es sogar null werden kann und es keine Rolle spielt.

Es ist diese Indirektheit und Unterschied von normalen Methoden, die verpönt ist. Es ist am besten, es direkt als Calendar.getInstance() auszudrücken.

erklären, warum gerade nicht einfach:

Wenn Sie nicht statische Methode aufrufen, 1) Sie schaffen neue Instanz mit a = neuer Klasse (); 2), dann ruft Methode a.method;

Wenn Sie rufen statische Methode: 1) Sie nennen es class.method;

Sie können es mit statischer Methode tun, nur weil es in seiner Klasse unabhängig ist und alle haben es für den Aufruf benötigt. Wenn es auf einem anderen info (als Konstruktor) hängt nicht Sie es statisch deklarieren, wird es scheitern.

In Java alle statischen Membervariablen werden zuerst in den Speicher geladen werden,   werden dann alle statischen Elemente geladen,   Danach werden nicht-statischen Variablen und Elementfunktionen werden in den Speicher geladen werden,   Danach wird statischer Hauptblock ausgeführt ....... so es gab den Fehler, dass ein nicht ..............

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