Qual è la differenza tra campo, variabile, attributo e proprietà nei POJO Java?


142

Quando mi riferivo a variabili private interne di POJO Java che hanno getter / setter, ho usato i seguenti termini:

  • campo
  • variabile
  • attributo
  • proprietà

C'è qualche differenza tra quanto sopra? In tal caso, qual è il termine corretto da usare? C'è un termine diverso da usare quando questa entità è persistente?

Risposte:


117

Da qui: http://docs.oracle.com/javase/tutorial/information/glossary.html


  • campo

    • Un membro di dati di una classe. Salvo diversamente specificato, un campo non è statico.

  • proprietà

    • Caratteristiche di un oggetto che gli utenti possono impostare, come il colore di una finestra.

  • attributo

    • Non elencato nel glossario sopra

  • variabile

    • Un elemento di dati denominato da un identificatore. Ogni variabile ha un tipo, come int o Object, e un ambito. Vedi anche variabile di classe, variabile di istanza, variabile locale.

27
Non capisco ancora la differenza tra un campo e una proprietà?
Koray Tugay,

1
@KorayTugay - Guarda un campo come un rudimentale pezzo di dati relativi a un oggetto. Una proprietà (per me) è una caratteristica di un oggetto che è visibile (e apparentemente mutevole) al mondo esterno.
jahroy,

Sulla base di quanto sopra, sarebbe corretto dire "Proprietà e campi sono gli stessi, tranne che una proprietà è un campo impostabile "?
jdurston,

2
@John - Forse in base a quanto sopra, che, come notato, è una copia / incolla da Oracle. Personalmente farei la distinzione che una proprietà è pubblicamente visibile e possibilmente mutevole, mentre un campo potrebbe essere un campo interno e privato utilizzato solo dalla classe.
jahroy,

1
Penso che la cosa migliore da sottolineare sia che l'esistenza come campo e proprietà non si escludono a vicenda. Dal modo in cui questa risposta è formulata, ai nuovi sviluppatori, sembra un elenco di cose distinte.
Kartik Chugh,

89

Si C'è.

La variabile può essere locale, sul campo o costante (anche se questo è tecnicamente errato). È vago come un attributo. Inoltre, dovresti sapere che ad alcune persone piace chiamare le variabili finali non statiche (locali o di istanza)

" Valori ". Questo probabilmente deriva dalle lingue emergenti di JVM FP come Scala.

Il campo è generalmente una variabile privata su una classe di istanza. Ciò non significa che ci sia un getter e un setter.

Attributo è un termine vago. Può essere facilmente confuso con l'API di denominazione XML o Java. Cerca di evitare di usare quel termine.

La proprietà è la combinazione getter e setter.

Alcuni esempi di seguito

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

}

Ci sono molte altre combinazioni, ma le mie dita si stanno stancando :)


3
@ Chris Thompson Ecco come lo chiama Eclipse in una delle sue finestre di dialogo. Ehi gente Java. Cosa posso dirti. Non ha senso.
Adam Gent,

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

@emory Beh, è ​​il vecchio ossimoro ben noto. Non è niente di specifico per Java, quel "problema" risale almeno fino a C e probabilmente più a lungo .. ovviamente nulla ti impedisce di chiamarlo semplicemente "costante"
Voo

@AdamGent Non è stato serio, ti stavo solo divertendo ;-)
Chris Thompson,

1
Una buona spiegazione mentre si prende in giro il modo in cui i nomi degli identificativi possono diventare ridicolmente lunghi (e spesso diventano ridicolmente lunghi).
sargas,

5

Se la tua domanda è stata posta utilizzando JAXB e volendo scegliere il corretto XMLAccessType, ho avuto la stessa domanda. JAXB Javadoc afferma che un "campo" è una variabile di istanza non statica e non transitoria. Una "proprietà" ha una coppia getter / setter (quindi dovrebbe essere una variabile privata). Un "membro pubblico" è pubblico e quindi probabilmente è una costante. Anche in JAXB, un "attributo" si riferisce a una parte di un elemento XML, come in <myElement myAttribute="first">hello world</myElement>.

Sembra che una "proprietà" di Java, in generale, possa essere definita come un campo con almeno un getter o un altro metodo pubblico che consente di ottenere il suo valore. Alcune persone dicono anche che una proprietà deve avere un setter. Per definizioni come questa, il contesto è tutto.


5

Dietel e Dietel hanno un buon modo di spiegare i campi rispetto alle variabili.

"Insieme le variabili statiche di una classe e le variabili di istanza sono conosciute come i suoi campi." (Sezione 6.3)

"Le variabili devono essere dichiarate come campi solo se sono necessarie per l'uso in più di un metodo della classe o se il programma deve salvare i loro valori tra le chiamate ai metodi della classe." (Sezione 6.4)

Quindi i campi di una classe sono le sue variabili statiche o di istanza, ovvero dichiarate con ambito di classe.

Riferimento - Dietel P., Dietel, H. - Java ™ How To Program (Early Objects), Decima Edizione (2014)


3

Se prendi idea di Hibernate:

Hibernate legge / scrive lo stato dell'oggetto con il suo campo. Hibernate mappa anche le proprietà dello stile Java Bean su DB Schema. Ibernazione Accedere ai campi per il caricamento / salvataggio dell'oggetto. Se la mappatura viene eseguita dalla proprietà, hibernate utilizza getter e setter.

È l'incapsulamento che differenzia significa dove hai getter / setter per un campo e si chiama proprietà, in tal modo e nascondiamo la struttura di dati sottostante di quella proprietà all'interno di setMethod, possiamo impedire cambiamenti indesiderati all'interno dei setter. Tutto ciò che l'incapsulamento sta per ...

I campi devono essere dichiarati e inizializzati prima di essere utilizzati. Principalmente per uso interno di classe.

Le proprietà possono essere modificate dal setter e sono esposte dai getter. Qui il prezzo del campo ha getter / setter quindi è proprietà.

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

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

Allo stesso modo usando i campi , [In letargo è il modo raccomandato per MAP usando i campi, dove int int privato; è annotato @Id, ma con Property hai più controllo]

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

Il documento Java dice: Field è un membro di dati di una classe. Un campo è una variabile di istanza non statica e non transitoria. Il campo è generalmente una variabile privata su una classe di istanza.


2

Le variabili sono composte da campi e non campi.

I campi possono essere:

  1. Campi statici o
  2. campi non statici chiamati anche istanziazioni ad es. x = F ()

I non campi possono essere:

  1. variabili locali, analogo dei campi ma all'interno di un metodo anziché al di fuori di tutti, oppure
  2. parametri ad es. y in x = f (y)

In conclusione, la distinzione chiave tra le variabili è se si tratta di campi o non campi, ovvero se si trovano all'interno di un metodo o al di fuori di tutti i metodi.

Esempio di base (mi scusi per la mia sintassi, sono solo un principiante)

Class {    
    //fields    

    method1 {              
         //non-fields    

    }    
}

1

In realtà questi due termini sono spesso usati per rappresentare la stessa cosa, ma ci sono alcune situazioni eccezionali. Un campo può memorizzare lo stato di un oggetto. Inoltre tutti i campi sono variabili. Quindi è chiaro che possono esserci variabili che non sono campi. Quindi esaminando i 4 tipi di variabili (variabile di classe, variabile di istanza, variabile locale e variabile di parametro) possiamo vedere che le variabili di classe e le variabili di istanza possono influenzare lo stato di un oggetto. In altre parole, se una variabile di classe o istanza cambia, lo stato dell'oggetto cambia. Quindi possiamo dire che le variabili di classe e le variabili di istanza sono campi mentre le variabili locali e le variabili dei parametri non lo sono.

Se vuoi capire più a fondo, puoi andare alla fonte qui sotto: -

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


0

La domanda è vecchia ma un'altra importante differenza tra una variabile e un campo è che un campo ottiene un valore predefinito quando viene dichiarato. D'altra parte, una variabile deve essere inizializzata.


Che ne dici di una proprietà?
Koray Tugay,

0

La mia comprensione è come di seguito, e non sto dicendo che questo è corretto al 100%, potrei anche sbagliarmi ..

Una variabile è qualcosa che dichiari, che può cambiare per impostazione predefinita e avere valori diversi, ma che si può anche dire esplicitamente come finale. In Java questo sarebbe:

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

Quindi, in sostanza, una variabile è tutto ciò che viene dichiarato e può contenere valori. Il metodo foo sopra restituisce ad esempio una variabile. Restituisce una variabile di tipo Integer che contiene l'indirizzo di memoria del nuovo Integer (); Tutto il resto che vedi sopra sono anche variabili, listVariable, aFinalVariableExample e spiegato qui:

Un campo è una variabile in cui l'ambito è più chiaro (o concreto). La variabile che ritorna dall'ambito del metodo foo non è chiara nell'esempio sopra, quindi non la definirei un campo. D'altra parte, iAmAlsoVariable è un campo "locale", limitato dall'ambito del metodo foo, e listVariable è un campo "istanza" in cui l'ambito del campo (variabile) è limitato dall'ambito degli oggetti.

Una proprietà è un campo a cui è possibile accedere / modificare. Qualsiasi campo che espone un getter / setter è una proprietà.

Non conosco l'attributo e vorrei anche ripetere che questa è la mia comprensione di quali variabili, campi e proprietà sono.


0
  • variable- nome dell'indirizzo di archiviazione. Ogni variabile ha un tipo che definisce dimensioni, attributi e comportamenti della memoria. Ci sono per i tipi di variabili Java: class variable, instance variable, local variable,method parameter
//pattern
<Java_type> <name> ;

//for example
int myInt;
String myString;
CustomClass myCustomClass;
  • field- variabile membro o membro dati. È un variabledentro un class( class variableo instance variable)

  • attribute- in alcuni articoli puoi scoprire che attributeè una objectrappresentazione di class variable. Objectopera con la attributesquale definisce un insieme di caratteristiche.

CustomClass myCustomClass = new CustomClass();
myCustomClass.something = "poor fantasy"; //something is an attribute of myCustomClass object with a "poor fantasy" value
  • property- field+ limitato getter/setter. Ha una sintassi del campo ma usa metodi sotto il cofano. Javanon lo supporta in forma pura. Date un'occhiata a Objective-C, Swift,Kotlin

Ad esempio Kotlinesempio:

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

[Variabile rapida, proprietà]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.