web-dev-qa-db-ja.com

Java POJOのフィールド、変数、属性、およびプロパティの違いは何ですか?

ゲッター/セッターを持つJava POJOの内部プライベート変数を参照するとき、次の用語を使用しました。

  • フィールド
  • 変数
  • 属性
  • 財産

上記の間に違いはありますか?もしそうなら、正しい用語は何ですか?このエンティティが永続化されるときに使用する別の用語はありますか?

133

ここから: http://docs.Oracle.com/javase/tutorial/information/glossary.html


  • フィールド

    • クラスのデータメンバー。特に指定がない限り、フィールドは静的ではありません。

  • 財産

    • ウィンドウの色など、ユーザーが設定できるオブジェクトの特性。

  • 属性

    • 上記の用語集には記載されていません

  • 変数

    • 識別子で指定されたデータのアイテム。各変数には、intやObjectなどのタイプとスコープがあります。クラス変数、インスタンス変数、ローカル変数も参照してください。
115
jahroy

はいあります。

変数は、ローカル、フィールド、または定数です(技術的には間違っていますが)。属性があいまいです。また、一部の人々はfinal非静的(ローカルまたはインスタンス)変数を呼び出すことを好むことを知っておく必要があります。

""。これはおそらく、Scalaのような新しいJVM FP言語に由来します。

フィールドは通常、インスタンスクラスのプライベート変数です。ゲッターとセッターがあるという意味ではありません。

属性はあいまいな用語です。 XMLまたはJava Naming APIと簡単に混同される可能性があります。その用語を使用しないようにしてください。

プロパティはゲッターとセッターの組み合わせです。

以下のいくつかの例

public class Variables {

    //Constant
    public final static String MY_VARIABLE = "that was a lot for a constant";

    //Value
    final String dontChangeMeBro = "my god that is still long for a val";

    //Field
    protected String flipMe = "wee!!!";

    //Property
    private String ifYouThoughtTheConstantWasVerboseHaHa;

    //Still the property
    public String getIfYouThoughtTheConstantWasVerboseHaHa() {
        return ifYouThoughtTheConstantWasVerboseHaHa;
    }

    //And now the setter
    public void setIfYouThoughtTheConstantWasVerboseHaHa(String ifYouThoughtTheConstantWasVerboseHaHa) {
        this.ifYouThoughtTheConstantWasVerboseHaHa = ifYouThoughtTheConstantWasVerboseHaHa;
    }

}

さらに多くの組み合わせがありますが、私の指は疲れています:)

83
Adam Gent

ディーテルとディーテルには、フィールドと変数を説明する素晴らしい方法があります。

「クラスの静的変数とインスタンス変数を合わせてフィールドと呼びます。」(セクション6.3)

「変数は、クラスの複数のメソッドで使用する必要がある場合、またはプログラムがクラスのメソッドの呼び出し間で値を保存する必要がある場合にのみ、フィールドとして宣言する必要があります。」(6.4節)

そのため、クラスのフィールドはその静的変数またはインスタンス変数です。つまり、クラススコープで宣言されています。

リファレンス-Dietel P.、Dietel、H.-Java™How To Program(Early Objects)、第10版(2014)

5
Mango

JAXBを使用して正しいXMLAccessTypeを選択することによって質問が表示された場合、同じ質問がありました。 JAXB Javadoc は、「フィールド」が非静的、非一時的なインスタンス変数であることを示しています。 「プロパティ」にはゲッター/セッターのペアがあります(したがって、プライベート変数である必要があります)。 「パブリックメンバー」はパブリックであるため、おそらく定数です。 JAXBでも、「属性」は<myElement myAttribute="first">hello world</myElement>のようにXML要素の一部を指します。

一般的に、Java「プロパティ」は、少なくともゲッ​​ターまたはその値を取得できる他のパブリックメソッドを持つフィールドとして定義できるようです。また、プロパティにはセッターが必要であると言う人もいます。このような定義では、コンテキストがすべてです。

5
hotshot309

Hibernateからヒントを得る場合:

Hibernateは、フィールドを使用してオブジェクトの状態を読み書きします。 Hibernateは、Java BeanスタイルのプロパティをDBスキーマにマップします。 Hibernateオブジェクトのロード/保存のためにフィールドにアクセスします。マッピングがプロパティによって行われる場合、hibernateはゲッターとセッターを使用します。

カプセル化は、フィールドのゲッター/セッターがあり、プロパティと呼ばれる場所を区別することを意味し、それにより、setMethod内でそのプロパティの基本データ構造を非表示にし、セッター内の不要な変更を防ぐことができます。すべてカプセル化は...を表します

Fieldsは、使用する前に宣言および初期化する必要があります。主にクラスの内部使用向け。

プロパティはセッターによって変更でき、ゲッターによって公開されます。ここで、フィールド価格にはゲッター/セッターがあるため、プロパティです。

class Car{
 private double price;
 public double getPrice() {…};
 private void setPrice(double newPrice) {…};
}

<class name="Car" …>
<property name="price" column="PRICE"/>
</class>

同様にfieldsを使用します。[休止状態では、フィールドを使用してMAPを実行する方法としてお勧めします。 @Idアノテーションが付けられていますが、プロパティを使用するとより詳細に制御できます]

class Car{
  private double price;
}
<class name="Car">
<property name=" price" column="PRICE" access="field"/>
</class>

Java docによると:フィールドはクラスのデータメンバーです。フィールドは、非静的で非一時的なインスタンス変数です。通常、フィールドはインスタンスクラスのプライベート変数です。

2
vimal krishna

変数は、フィールドと非フィールドで構成されます。

フィールドは次のいずれかです。

  1. 静的フィールドまたは
  2. インスタンス化とも呼ばれる非静的フィールドx = F()

非フィールドは次のいずれかです。

  1. ローカル変数、フィールドの類似物であるが、すべての外部ではなくメソッドの内部、または
  2. パラメータ、例えばx = f(y)のy

結論として、変数の重要な違いは、変数がフィールドであるか非フィールドであるか、つまり、メソッドの内部にあるのか、すべてのメソッドの外部にあるのかということです。

基本的な例(構文についてすみません、私は初心者です)

Class {    
    //fields    

    method1 {              
         //non-fields    

    }    
}
1
the_prole

実際、これら2つの用語は同じものを表すためによく使用されますが、例外的な状況もあります。フィールドはオブジェクトの状態を保存できます。また、すべてのフィールドは変数です。したがって、フィールドではない変数が存在する可能性があることは明らかです。 4つのタイプの変数(クラス変数、インスタンス変数、ローカル変数、パラメーター変数)を見ると、クラス変数とインスタンス変数がオブジェクトの状態に影響を与えることがわかります。つまり、クラスまたはインスタンス変数が変更されると、オブジェクトの状態が変更されます。そのため、クラス変数とインスタンス変数はフィールドであり、ローカル変数とパラメーター変数はそうではないと言えます。

より深く理解したい場合は、以下のソースに移動できます。

http://sajupauledayan.com/Java/fields-vs-variables-in-Java

1
Sagar Patel

私の理解は以下の通りであり、これが100%正しいと言っているわけではありません。間違っているかもしれません。

変数は宣言するものであり、デフォルトで変更され、異なる値を持つことができますが、明示的に最終であるとも言えます。 Javaでは、次のようになります。

public class Variables {

    List<Object> listVariable; // declared but not assigned
    final int aFinalVariableExample = 5; // declared, assigned and said to be final!

    Integer foo(List<Object> someOtherObjectListVariable) {
        // declare..
        Object iAmAlsoAVariable;

        // assign a value..
        iAmAlsoAVariable = 5;

        // change its value..
        iAmAlsoAVariable = 8;

        someOtherObjectListVariable.add(iAmAlsoAVariable);

        return new Integer();
    }
}

したがって、基本的に、変数は宣言され、値を保持できるものです。上記のメソッドfooは、たとえば変数を返します。新しいInteger()のメモリアドレスを保持するInteger型の変数を返します。上記の他のすべても変数listVariable、a​​FinalVariableExampleであり、ここで説明します。

フィールドは、スコープがより明確な(または具体的な)変数です。メソッドfooのスコープから返される変数は上記の例では明確ではないため、フィールドとは呼びません。一方、iAmAlsoVariableはメソッドfooのスコープによって制限される「ローカル」フィールドであり、listVariableはフィールド(変数)のスコープがオブジェクトスコープによって制限される「インスタンス」フィールドです。

プロパティは、アクセス/変更可能なフィールドです。ゲッター/セッターを公開するフィールドはプロパティです。

属性については知りません。また、これが変数、フィールド、プロパティが何であるかを理解していることを繰り返したいと思います。

0
Koray Tugay

問題は古いですが、変数とフィールドのもう1つの重要な違いは、フィールドが宣言されたときにデフォルト値を取得することです。一方、変数は初期化する必要があります。

0
Peter Clause