非静的メソッドから静的メソッドへのアクセスが悪いのはなぜですか?

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

  •  03-07-2019
  •  | 
  •  

質問

Netbeansは、非静的メソッドから静的メソッドにアクセスするのは悪いことだと言っています。なぜこれが悪いのですか? "静的メソッドgetInstanceへのアクセス"警告です:

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

}

役に立ちましたか?

解決

あなたはおそらく直接ではなくインスタンスから静的メソッドにアクセスしているでしょう。代わりに Calendar.getInstance()を使用してみてください:

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

他のヒント

「静的メソッドを返す」とはどういう意味ですか?私の見解では、インスタンスメソッドから静的メソッドを呼び出すことは問題ありません-もちろん、状況によって異なります。 Netbeansが不満を言っているコードを投稿できますか?

私が考えられることの1つは、インスタンスのデータを一切使用せずに、インスタンスメソッドから静的メソッドのみを使用する場合です。インターフェースを実装したり、基本クラスのメソッドをオーバーライドしたりするために必要な場合もありますが、何もオーバーライドせず、インスタンス変数を使用しない場合は、メソッドが静的ではないことを示すと便利です特定のインスタンスに依存します。

編集:編集された質問では、これは非常に理にかなっています。 IMOそれは、そもそもそれを可能にするJavaの欠陥です。非常に紛らわしいコードになる可能性があります。私のお気に入りの例(つまり、昔の人は私が以前に投稿したのを見たことがあるかもしれません)は、 Thread.sleep を使用しています。このコードのように見た目は何ですか?

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

私には、 suspend の呼び出しと同様に、新しいスレッドがスリープするように求められているように見えます。しかし、いいえ-現在実行中のスレッドにのみスリープを要求することができます。そのため、 Thread.sleep は静的メソッドです。上記のコードは正当なJavaであり、新しく作成されたスレッドが(おそらく)実行されている間、現在実行中のスレッドを2秒間スリープ状態にします。

順序を逆にしましたか?その場合、静的メソッドから非静的メソッドにアクセスできないことは理にかなっています。そうでない場合、なぜこれも悪いのか知りたいです!

静的コンテキストから非静的メソッドを参照することはできません。静的メソッドは、非静的コンテキストから参照できます。

Netbeansのエラーまたは警告ですか?原因となっているコードを投稿できますか?

time.getInstance()を呼び出しても問題ありません。コンパイラーは変数の型、この場合は Calendar を調べ、そこでメソッドを呼び出します。最終的には Calendar.getInstance()としてコンパイルされます。 time の実際の値はこれに寄与しません。つまり、 null であっても問題ありません。

この間接性と通常のメソッドとの違いが嫌われています。 Calendar.getInstance()として直接表現するのが最善です。

単純な説明をしない理由:

非静的メソッドを呼び出す場合、 1)a = new Class()で新しいインスタンスを作成します。 2)次に、メソッドa.methodを呼び出します。

静的メソッドを呼び出す場合: 1)Class.methodと呼びます;

静的メソッドを使用すると、クラス内で独立しており、呼び出しに必要なすべてのものがあるため、静的メソッドで実行できます。 (コンストラクタとして)他の情報に依存している場合、静的と宣言しないと失敗します。

Javaでは、すべての静的メンバー変数が最初にメモリにロードされますが、   すべての静的メンバーがロードされます、   その後、非静的変数とメンバー関数がメモリにロードされ、   その後、静的メインブロックが実行されます。 ので、エラーを与えていた..............

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top