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


142

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

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

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

回答:


117

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


  • フィールド

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

  • 財産

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

  • 属性

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

  • 変数

    • 識別子によって名前が付けられたデータのアイテム。各変数には、intやObjectなどの型とスコープがあります。クラス変数、インスタンス変数、ローカル変数も参照してください。

27
フィールドとプロパティの違いがまだわかりませんか?
Koray Tugay

1
@KorayTugay-フィールドを、オブジェクトに関連する基本的なデータの一部と見なします。プロパティ(私にとって)は、外部の世界から見える(そして明らかに変更可能な)オブジェクトの特性です。
jahroy

上記に基づいて、「プロパティは設定可能なフィールドであることを除いて、プロパティとフィールドは同じです」と言うのは公平でしょうか?
jdurston

2
@John-おそらく上記に基づいており、前述のとおり、これはOracleからのコピー/貼り付けです。個人的には、プロパティはパブリックに表示され、場合によっては変更可能であることを区別しますが、フィールド、クラスによってのみ使用される内部のプライベートフィールドである可能性があります。
jahroy

1
強調すべき最も良いことは、フィールドとプロパティとしての存在が相互に排他的ではないということです。この答えの言い方から、新しい開発者にとって、それは明確なもののリストのように見えます。
Kartik Chugh

89

はいあります。

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

」。これはおそらく、Scalaのような新興のJVM FP言語によるものです。

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

属性は曖昧な用語です。XMLまたはJavaネーミング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;
    }

}

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


3
@Chris Thompsonそれは、Eclipseがダイアログの1つでそれを呼び出すものです。やあ、Java。何と言えますか?それは意味がありません。
アダム・ゲント

4
@AdamGent JAVA = Just Another Vague Acronym :)
emory

@emoryまあ、それは古い有名なオキシモロンです。「問題は」長いおそらく少なくともCとでまでさかのぼることをJavaへの何も具体的な..明らかに何も単に「定数」と呼んからあなたを停止しないこと
VOO

@AdamGent深刻ではなく、ただあなたに苦労しました;-)
Chris Thompson

1
識別子の名前が途方もなく長くなる可能性があることを楽しみながら、良い説明をします(そして、途方もなく長くなることがよくあります)。
sargas 2016年

5

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

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


5

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

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

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

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

リファレンス-Dietel P.、Dietel、H。-Java™ハウツープログラム(初期オブジェクト)、第10版(2014)


3

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

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

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

フィールドは、使用する前に宣言して初期化する必要があります。主にクラス内部で使用します。

プロパティはセッターによって変更でき、ゲッターによって公開されます。ここでフィールド価格はゲッター/セッターを持っているのでそれは財産です。

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

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

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

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

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


2

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

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

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

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

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

結論として、変数間の主な違いは、それらがフィールドであるか非フィールドであるか、つまり、メソッド内またはすべてのメソッド外にあるかどうかです。

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

Class {    
    //fields    

    method1 {              
         //non-fields    

    }    
}

1

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

より深く理解したい場合は、以下のソースをご覧ください。

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


0

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


プロパティはどうですか?
Koray Tugay

0

私の理解は以下の通りであり、これが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
  • variable-名前付きストレージアドレス。すべての変数には、メモリサイズ、属性、および動作を定義する型があります。Java変数の種類のためにありますclass variableinstance variablelocal variablemethod parameter
//pattern
<Java_type> <name> ;

//for example
int myInt;
String myString;
CustomClass myCustomClass;
  • field-メンバー変数またはデータメンバー。それはvariable内部のA classclass variableまたはinstance variable

  • attribute-一部の記事attributeでは、それがのobject表現であることがわかりますclass variable。一連の特性を定義Objectすることによって動作しattributesます。

CustomClass myCustomClass = new CustomClass();
myCustomClass.something = "poor fantasy"; //something is an attribute of myCustomClass object with a "poor fantasy" value
  • property- field+境界getter/setter。フィールド構文がありますが、内部でメソッドを使用します。Java純粋な形式ではサポートしていません。見てみましょうObjective-CSwiftKotlin

例のためのKotlinサンプル:

//field - Backing Field
class Person {
    var name: String = "default name"
        get() = field
        set(value) { field = value }
}

//using
val person = Person()
person.name = "Alex"    // setter is used
println(person.name)    // getter is used

[Swift変数、プロパティ]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.