web-dev-qa-db-ja.com

Javaでのプライベート静的変数の使用は何ですか?

変数がpublic static varName;として宣言されている場合は、どこからでもClassName.varNameとしてアクセスできます。また、静的メンバーはクラスのすべてのインスタンスで共有され、各インスタンスで再割り当てされないことにも気付いています。

変数をprivate static varName;として宣言することは、変数をprivate varName;として宣言することと少し違いますか?

どちらの場合も、他のクラスからClassName.varNameまたはClassInstance.varNameとしてアクセスすることはできません。

その変数をstaticとして宣言することは他の特別な性質を与えますか?

141
Vaibhav Jani

もちろんそれはClassName.var_nameとしてアクセスすることができますが、それが定義されているクラスの内側からのみです - それはprivateとして定義されているからです。

public staticまたはprivate static変数は多くの場合定数に使用されます。たとえば、多くの人は自分のコードに定数を「ハードコード」するのを好みません。彼らは意味のある名前でpublic staticまたはprivate static変数を作成し、それをコード内で使用するのが好きです。これはコードを読みやすくするはずです。 (そのような定数もfinalにするべきです)。

例えば:

public class Example {
    private final static String JDBC_URL = "jdbc:mysql://localhost/shopdb";
    private final static String JDBC_USERNAME = "username";
    private final static String JDBC_PASSWORD = "password";

    public static void main(String[] args) {
        Connection conn = DriverManager.getConnection(JDBC_URL,
                                         JDBC_USERNAME, JDBC_PASSWORD);

        // ...
    }
}

publicまたはprivateのどちらにするかは、変数をクラスの外に表示するかどうかによって異なります。

108
Jesper

静的変数は、クラスのすべてのインスタンスに対して単一の値を持ちます。

あなたが何かをするつもりならば:

public class Person
{
    private static int numberOfEyes;
    private String name;
}

それからあなたはあなたの名前を変えたかった、それは大丈夫、私の名前は変わらない。しかし、あなたが17個の目を持つようにそれを変えたければ、世界中の誰もが17個の目を持つことになります。

91
TofuBeer

プライベート静的変数は、プライベートインスタンス変数と同じように便利です。同じクラス内のコードによってのみアクセスされる状態を格納します。アクセシビリティ(private/public/etc)とインスタンス/静的な変数の性質は完全に直交する概念です。

静的変数がクラスの「すべてのインスタンス」の間で共有されていると考えることは避けます。つまり、状態を表すには少なくともoneインスタンスが必要です。いいえ - 静的変数は、型のanyインスタンスではなく、型自体に関連付けられます。

そのため、特定のインスタンスではなく型に関連付けられた状態を必要とし、その状態を非公開にしたい場合(たとえば、プロパティを介したアクセス制御など)、非公開の静的変数を使用するのが合理的です。

余談ですが、公開する(または非公開にする)変数ののみ型は定数、つまり不変型の静的最終変数にすることを強くお勧めします。他のものはすべて、APIと実装を分離するために(とりわけ)プライベートにする必要があります。

43
Jon Skeet

private static変数は、そのクラスのインスタンス間でデータを共有するために使用できます。 private staticClassName.memberのようなコンストラクトを使ってClassInstance.member変数にアクセスすることはできませんが、メンバーはそのクラスのメソッドまたはそのクラスのインスタンスから常に見えるようになることは正しいのですが。そのため、実際にはそのクラスのインスタンスは常にmemberを参照できます。

8
Swaranga Sarma

そうですね、クラスのインスタンスを作成せずにパブリック静的変数を使用するのは正しいのですが、プライベート静的変数は使用しません。これらと私がプライベート静的変数を使用する場所との主な違いは、静的関数で変数を使用する必要がある場合です。静的関数には静的変数しか使用できないので、他のクラスからそれらにアクセスしないようにそれらを非公開にします。それが私がprivate staticを使う唯一のケースです。

これが一例です。

Class test {
   public static String name = "AA";
   private static String age;

   public static void setAge(String yourAge) {
       //here if the age variable is not static you will get an error that you cannot access non static variables from static procedures so you have to make it static and private to not be accessed from other classes
       age = yourAge;
   }
}
8
Farid Farhat

変数をprivate static varName;として宣言することは、変数をprivate varName;として宣言することと少し違いますか?

はい、どちらも違います。そして最初のものはそのclassに対して単一の値を保持するのでclass variableと呼ばれますが、他のものはそれが異なるinstances(Objects)に対して異なる値を保持することができるのでinstance variableと呼ばれます。最初のインスタンスはjvmで一度だけ作成され、他のインスタンスはインスタンスごとに一度作成されます。つまり、インスタンスが10個ある場合、jvmには10個の異なるprivate varName;があります。

変数をstaticとして宣言すると、他の特別なプロパティが与えられますか?

はい、静的変数は通常のインスタンス変数とは異なるいくつかのプロパティを取得します。 class variables(staticとして宣言されているインスタンス変数)はClassName.varNameのようなクラス名を使って直接アクセスすることができます。インスタンス変数とは異なり、そのクラスのどのオブジェクトもその値にアクセスして値を変更できますが、それぞれのオブジェクトだけがアクセスできます。クラス変数は静的メソッドで使用できます。

Javaでのprivate static variableの使用は何ですか?

論理的には、private static variablepublic static variableと変わりはありません。むしろ最初のものがより多くの制御を与えます。 IMOでは、public static variableのgetterメソッドおよびsetterメソッドを使用して、private static variablepublic staticに文字通り置き換えることができます。

private static variableで広く使用されている分野の1つは、単純なSingletonパターンの実装です。ここでは、全世界でそのクラスのインスタンスは1つだけになります。ここでstatic識別子は、その単一のインスタンスが外部からアクセス可能になるために非常に重要な役割を果たしています(もちろん、パブリック静的なgetterメソッドも主な役割を果たしています)。

public class Singleton {
    private static Singleton singletonInstance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return Singleton.singletonInstance;
    }
}
6
avr

プライベート静的クラス変数の使用は何ですか?

図書館の本Classがあるとしましょう。新しいブックを作成するたびに、それに一意のIDを割り当てます。 1つの方法は、単純に0から始めてid番号を増やすことです。しかし、他のすべての本が最後に作成したID番号をどのようにして知るのでしょうか。簡単です、静的変数として保存してください。利用者は実際の内部ID番号が各本のものであることを知る必要がありますか?その情報は非公開です。

public class Book {
    private static int numBooks = 0;
    private int id;
    public String name;

    Book(String name) {
        id = numBooks++;
        this.name = name;
    }
}

これは人為的な例ですが、すべてのクラスインスタンスが他の人から秘密にされるべき共通の情報にアクセスできるようにしたいケースを容易に考えることができます。それができなくても、できる限り非公開にすることをお勧めします。たとえBookユーザーがこのnumBooksフィールドで何もすることを想定していなかったとしても、誤ってそのnumBooksフィールドをパブリックにした場合はどうなりますか。それから誰かが新しい本を作成せずに本の数を変更することができます。

とてもこっそり!

5
iheanyi

Privateキーワードはクラス内の変数アクセスに使用し、staticメソッドでも変数にアクセスできるという意味でstaticを維持しますが、参照変数はstaticメソッドではアクセスできません。

4
Raam

もう一つの視点:

  1. クラスとそのインスタンスは実行時に2つの異なるものです。クラス情報は、そのクラスのすべてのインスタンスによって「共有」されます。
  2. 非静的クラス変数はインスタンスに属し、静的変数はクラスに属します。
  3. インスタンス変数がプライベートまたはパブリックになるのと同じように、静的変数もプライベートまたはパブリックになることができます。
2
Santosh

静的メソッドで変数を使用する場合、その変数も例として静的である必要があります。

private static int a=0;  
public static void testMethod() {  
        a=1;  
}
1
Neifen

いくつかの人々にとって、これは2つの異なる言語で見ればもっと理にかなっているので、私はJavaで例を書き、私のページでこれらの修飾子のいくつかを説明するPHPを書きました。あなたはこれについて間違って考えているかもしれません。

私の例を見ても意味がありません。ここに行きなさい http://www.siteconsortium.com/h/D0000D.php

しかし、肝心な点は、それが言っていることとほとんど同じだということです。これはプライベートな静的メンバー変数です。たとえば、Singletonオブジェクトを作成したい場合は、なぜSingletonExample.instance変数をpublicにしたいのでしょう。もしあなたがそのクラスを使っていた人がその値を簡単に上書きする可能性があるならば。

それだけです。

 
パブリッククラスSingletonExample {
プライベートstatic SingletonExampleインスタンス= null; 
プライベート静的int値= 0; 
 private SingletonExample(){[。 ++ this.value; 
} 
 public static SingletonExample getInstance(){
 if(instance!= null)
インスタンスを返す; 
 。[synchronized](SingletonExample.class){
 instance = new SingletonExample(); 
インスタンスを返す; 
} 
} 
 public void printValue( ){
 System.out.print(this.value); 
} 
 
 public static void main(String [] args){
 SingletonExample instance = getInstance(); 
 instance.printValue(); 
 instance = getInstance(); 
 instance.printValue(); 
} 
 ]} 
 
1
JTHouseCat

クラスでプライベート静的変数を使用すると、クラスの静的内部クラスが変数に到達する可能性があります。これはコンテキストセキュリティには完璧です。

1
Erdal76t

静的変数は、クラスのすべてのインスタンスに共通の変数です。あるインスタンスがそれを変更すると、静的変数の値は他のすべてのインスタンスに対して更新されます。

1
Nagesh Tripathi

プライベート静的変数もサブクラスで共有されます。 1つのサブクラスを変更して、もう1つのサブクラスが変更された値を取得する場合、その場合、それはあなたが期待したものではないかもしれません。

public class PrivateStatic {

private static int var = 10;
public void setVar(int newVal) {
    var = newVal;
}

public int getVar() {
    return var;
}

public static void main(String... args) {
    PrivateStatic p1 = new Sub1();
    System.out.println(PrivateStatic.var);
    p1.setVar(200);

    PrivateStatic p2 = new Sub2();
    System.out.println(p2.getVar());
}
}


class Sub1 extends PrivateStatic {

}

class Sub2 extends PrivateStatic {
}
0
djiao

ThreadLocal変数は通常、private staticとして実装されています。この方法では、これらはクラスにバインドされず、各スレッドは独自の "threadLocal"オブジェクトへの独自の参照を持ちます。

0
Mehmet Erdemsoy

私はJavaに慣れていませんが、私が静的変数を使用する1つの方法は、私が多くの人々がそうしていると思うように、クラスのインスタンスの数を数えることです。例えば。:

public Class Company {
    private static int numCompanies;

    public static int getNumCompanies(){
        return numCompanies;
    }
}

その後、sysoutすることができます:

Company.getNumCompanies();

また、クラスの各インスタンスからnumCompaniesにアクセスすることもできますが(これは完全には理解できません)、「静的な方法」にはなりません。これがベストプラクティスかどうかはわかりませんが、私には意味があります。

0
pyetti

変数がpublic staticとして定義されている場合、その変数はどのクラスからでもそのクラス名を介してアクセスできます。

通常、関数は、実装クラス名を呼び出すだけでアクセスできるpublic staticとして定義されています。

その良い例がThreadクラスのsleep()メソッドです。

Thread.sleep(2500);

変数がprivate staticとして定義されている場合は、そのクラス内でのみアクセスできます。そのため、クラス名は不要です。あるいは、クラス名をそのまま使用することもできます(自分で)。 private var_nameとprivate static var_nameの違いは、プライベート静的変数はクラスの静的メソッドによってのみアクセスできるのに対し、プライベート変数はそのクラスの任意のメソッドによってアクセスできることです(静的メソッドを除く)。

その良い例は、変数をprivate staticとして宣言する必要があるデータベース接続または定数を定義するときです。

別の一般的な例は

private static int numberOfCars=10;

public static int returnNumber(){

return numberOfCars;

}
0
ronak Hingar

*)変数がprivateとして宣言されている場合、それはクラスの外では見えません。これはデータ隠蔽として呼ばれます。

*)変数がstaticとして宣言されている場合、その変数の値はすべてのインスタンスで同じであり、その変数を呼び出すためのオブジェクトを作成する必要はありません。

classname.variablename;

0
Deepak Bala