Was ist der Unterschied zwischen Feld, Variable, Attribut und Eigenschaft in Java-POJOs?

142

Wenn ich mich auf interne private Variablen von Java-POJOs beziehe, die Getter / Setter haben, habe ich die folgenden Begriffe verwendet:

  • Feld
  • Variable
  • Attribut
  • Eigentum

Gibt es einen Unterschied zwischen den oben genannten? Wenn ja, wie lautet der richtige Begriff? Gibt es einen anderen Begriff, wenn diese Entität beibehalten wird?

Victor Lyuboslavsky
quelle

Antworten:

117

Von hier aus: http://docs.oracle.com/javase/tutorial/information/glossary.html


  • Feld

    • Ein Datenelement einer Klasse. Sofern nicht anders angegeben, ist ein Feld nicht statisch.

  • Eigentum

    • Merkmale eines Objekts, die Benutzer festlegen können, z. B. die Farbe eines Fensters.

  • Attribut

    • Nicht im obigen Glossar aufgeführt

  • Variable

    • Ein Datenelement, das durch eine Kennung benannt ist. Jede Variable hat einen Typ wie int oder Object und einen Bereich. Siehe auch Klassenvariable, Instanzvariable, lokale Variable.
jahroy
quelle
27
Ich verstehe den Unterschied zwischen einem Feld und einer Eigenschaft immer noch nicht?
Koray Tugay
1
@KorayTugay - Betrachten Sie ein Feld als ein rudimentäres Datenelement, das sich auf ein Objekt bezieht. Eine Eigenschaft (für mich) ist ein Merkmal eines Objekts, das für die Außenwelt sichtbar (und anscheinend veränderlich) ist.
Jahroy
Wäre es auf der Grundlage des oben Gesagten fair zu sagen, dass "Eigenschaften und Felder gleich sind, außer dass eine Eigenschaft ein einstellbares Feld ist"?
Jdurston
2
@ John - Vielleicht basierend auf dem oben Gesagten, was, wie erwähnt, ein Kopieren / Einfügen von Oracle ist. Persönlich würde ich den Unterschied machen , dass eine Eigenschaft öffentlich sichtbar ist und möglicherweise wandelbar, während ein Feld könnte ein internes, privates Feld nur von der Klasse verwendet werden.
Jahroy
1
Ich denke, das Beste, was zu betonen ist, ist, dass sich die Existenz als Feld und Eigentum nicht gegenseitig ausschließt. Von der Art und Weise, wie diese Antwort formuliert ist, bis hin zu neuen Entwicklern sieht sie wie eine Liste verschiedener Dinge aus.
Kartik Chugh
89

Ja da ist.

Die Variable kann lokal, feldbezogen oder konstant sein (obwohl dies technisch falsch ist). Es ist vage wie Attribut. Außerdem sollten Sie wissen, dass einige Leute gerne endgültige nicht statische (lokale oder Instanz-) Variablen aufrufen

" Werte ". Dies kommt wahrscheinlich von neuen JVM-FP-Sprachen wie Scala.

Feld ist im Allgemeinen eine private Variable in einer Instanzklasse. Es bedeutet nicht, dass es einen Getter und einen Setter gibt.

Attribut ist ein vager Begriff. Es kann leicht mit XML oder Java Naming API verwechselt werden. Versuchen Sie, diesen Begriff nicht zu verwenden.

Eigenschaft ist die Kombination aus Getter und Setter.

Einige Beispiele unten

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

}

Es gibt viel mehr Kombinationen, aber meine Finger werden müde :)

Adam Gent
quelle
3
@ Chris Thompson So nennt es Eclipse in einem seiner Dialoge. Hey Leute, es ist Java. Was kann ich dir sagen. Es macht keinen Sinn.
Adam Gent
4
@AdamGent JAVA = Nur ein weiteres
vages
@emory Nun, es ist das alte bekannte Oxymoron. Das ist nichts Spezifisches für Java, dieses "Problem" geht bis mindestens C und wahrscheinlich länger zurück. Offensichtlich hindert Sie nichts daran, es nur "konstant" zu nennen
Voo
@AdamGent War nicht ernst, nur eine harte Zeit ;-)
Chris Thompson
1
Gute Erklärung, während Sie sich darüber lustig machen, wie Identifikatornamen lächerlich lang werden können (und sie werden oft lächerlich lang).
Sargas
5

Wenn Ihre Frage mithilfe von JAXB gestellt wurde und Sie die richtige auswählen wollten XMLAccessType, hatte ich dieselbe Frage. Das JAXB Javadoc sagt, dass ein "Feld" eine nicht statische, nicht vorübergehende Instanzvariable ist. Eine "Eigenschaft" hat ein Getter / Setter-Paar (es sollte also eine private Variable sein). Ein "öffentliches Mitglied" ist öffentlich und daher wahrscheinlich eine Konstante. Auch in JAXB bezieht sich ein "Attribut" auf einen Teil eines XML-Elements, wie in <myElement myAttribute="first">hello world</myElement>.

Es scheint, dass eine Java-Eigenschaft im Allgemeinen als ein Feld mit mindestens einem Getter oder einer anderen öffentlichen Methode definiert werden kann, mit der Sie ihren Wert ermitteln können. Einige Leute sagen auch, dass eine Immobilie einen Setter haben muss. Für solche Definitionen ist der Kontext alles.

hotshot309
quelle
5

Dietel und Dietel haben eine gute Möglichkeit, Felder und Variablen zu erklären.

"Zusammen werden die statischen Variablen und Instanzvariablen einer Klasse als ihre Felder bezeichnet." (Abschnitt 6.3)

"Variablen sollten nur dann als Felder deklariert werden, wenn sie für die Verwendung in mehr als einer Methode der Klasse erforderlich sind oder wenn das Programm ihre Werte zwischen Aufrufen der Methoden der Klasse speichern soll." (Abschnitt 6.4)

Die Felder einer Klasse sind also ihre statischen oder Instanzvariablen - dh sie werden mit dem Klassenbereich deklariert.

Referenz - Dietel P., Dietel, H. - Java ™ Programmieren (frühe Objekte), Zehnte Ausgabe (2014)

Mango
quelle
3

Wenn Sie einen Hinweis aus dem Ruhezustand entnehmen:

Der Ruhezustand liest / schreibt den Status des Objekts mit seinem Feld. Hibernate ordnet die Eigenschaften des Java Bean-Stils auch dem DB-Schema zu. Ruhezustand Greifen Sie auf die Felder zum Laden / Speichern des Objekts zu. Wenn die Zuordnung nach Eigenschaften erfolgt, verwendet der Ruhezustand den Getter und den Setter.

Es ist die Kapselung, die unterscheidet, was bedeutet, dass Sie Getter / Setter für ein Feld haben, und sie heißt Eigenschaft. Wenn wir die zugrunde liegende Datenstruktur dieser Eigenschaft in setMethod verbergen, können wir unerwünschte Änderungen in Setzern verhindern. Alles, wofür Kapselung steht ...

Felder müssen deklariert und initialisiert werden, bevor sie verwendet werden. Meistens für den klasseninternen Gebrauch.

Eigenschaften können vom Setter geändert werden und werden von Gettern verfügbar gemacht. Hier hat der Feldpreis Getter / Setter, also ist es Eigentum.

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

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

In ähnlicher Weise wird bei Verwendung von Feldern [im Ruhezustand die empfohlene Methode zum MAP mithilfe von Feldern verwendet, wobei private int id; ist mit @Id kommentiert, aber mit Property haben Sie mehr Kontrolle]

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

Das Java-Dokument sagt: Field ist ein Datenelement einer Klasse. Ein Feld ist eine nicht statische, nicht vorübergehende Instanzvariable. Feld ist im Allgemeinen eine private Variable in einer Instanzklasse.

vimal krishna
quelle
2

Variablen bestehen aus Feldern und Nichtfeldern.

Felder können entweder sein:

  1. Statische Felder oder
  2. Nicht statische Felder, auch Instanziierungen genannt, zB x = F ()

Nichtfelder können entweder sein:

  1. lokale Variablen, das Analogon von Feldern, aber innerhalb einer Methode und nicht außerhalb aller, oder
  2. Parameter zB y in x = f (y)

Zusammenfassend ist der Hauptunterschied zwischen Variablen, ob es sich um Felder oder Nichtfelder handelt, dh ob sie sich innerhalb einer Methode oder außerhalb aller Methoden befinden.

Grundlegendes Beispiel (entschuldigen Sie meine Syntax, ich bin nur ein Anfänger)

Class {    
    //fields    

    method1 {              
         //non-fields    

    }    
}
the_prole
quelle
1

Eigentlich werden diese beiden Begriffe oft verwendet, um dasselbe darzustellen, aber es gibt einige Ausnahmesituationen. Ein Feld kann den Status eines Objekts speichern. Auch alle Felder sind Variablen. Es ist also klar, dass es Variablen geben kann, die keine Felder sind. Wenn wir uns also die 4 Variablentypen (Klassenvariable, Instanzvariable, lokale Variable und Parametervariable) ansehen, können wir sehen, dass Klassenvariablen und Instanzvariablen den Status eines Objekts beeinflussen können. Mit anderen Worten, wenn sich eine Klassen- oder Instanzvariable ändert, ändert sich der Status des Objekts. Wir können also sagen, dass Klassenvariablen und Instanzvariablen Felder sind, lokale Variablen und Parametervariablen jedoch nicht.

Wenn Sie tiefer verstehen möchten, können Sie zur folgenden Quelle gehen: -

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

Sagar Patel
quelle
0

Die Frage ist alt, aber ein weiterer wichtiger Unterschied zwischen einer Variablen und einem Feld besteht darin, dass ein Feld beim Deklarieren einen Standardwert erhält. Andererseits muss eine Variable initialisiert werden.

Peter Klausel
quelle
Wie wäre es mit einer Immobilie?
Koray Tugay
0

Mein Verständnis ist wie folgt und ich sage nicht, dass dies 100% richtig ist, ich könnte mich genauso gut irren.

Eine Variable ist etwas, das Sie deklarieren, das sich standardmäßig ändern und unterschiedliche Werte haben kann, das aber auch explizit als endgültig bezeichnet werden kann. In Java wäre das:

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

Eine Variable ist also im Grunde alles, was deklariert ist und Werte enthalten kann. Die obige Methode foo gibt beispielsweise eine Variable zurück. Sie gibt eine Variable vom Typ Integer zurück, die die Speicheradresse der neuen Integer () enthält. Alles andere, was Sie oben sehen, sind ebenfalls Variablen, listVariable, aFinalVariableExample und werden hier erklärt:

Ein Feld ist eine Variable, bei der der Umfang klarer (oder konkreter) ist. Die Variable, die aus dem Bereich der Methode foo zurückkehrt, ist im obigen Beispiel nicht klar, daher würde ich sie nicht als Feld bezeichnen. Andererseits ist iAmAlsoVariable ein "lokales" Feld, das durch den Bereich der Methode foo begrenzt ist, und listVariable ist ein "Instanz" -Feld, in dem der Bereich des Feldes (der Variablen) durch den Objektbereich begrenzt ist.

Eine Eigenschaft ist ein Feld, auf das zugegriffen / das mutiert werden kann. Jedes Feld, das einen Getter / Setter verfügbar macht, ist eine Eigenschaft.

Ich weiß nichts über Attribute und möchte auch wiederholen, dass dies mein Verständnis der Variablen, Felder und Eigenschaften ist.

Koray Tugay
quelle
0
  • variable- benannte Speicheradresse. Jede Variable hat einen Typ, der eine Speichergröße, Attribute und Verhaltensweisen definiert. Es gibt für Arten von Java - Variablen: class variable, instance variable, local variable,method parameter
//pattern
<Java_type> <name> ;

//for example
int myInt;
String myString;
CustomClass myCustomClass;
  • field- Mitgliedsvariable oder Datenelement. Es ist ein variableInneres eines class( class variableoder instance variable)

  • attribute- In einigen Artikeln finden Sie, dass attributees sich um eine objectDarstellung von handelt class variable. Objectarbeitet, durch attributesdie eine Reihe von Merkmalen definiert werden.

CustomClass myCustomClass = new CustomClass();
myCustomClass.something = "poor fantasy"; //something is an attribute of myCustomClass object with a "poor fantasy" value
  • property- field+ begrenzt getter/setter. Es hat eine Feldsyntax, verwendet jedoch Methoden unter der Haube. Javaunterstützt es nicht in reiner Form. Werfen Sie einen Blick auf Objective-C, Swift,Kotlin

Zum Beispiel KotlinBeispiel:

//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

[Schnelle Variable, Eigenschaft]

yoAlex5
quelle