Quelle est la différence entre un champ, une variable, un attribut et une propriété dans les POJO Java?


142

En me référant aux variables privées internes des POJO Java qui ont des getters / setters, j'ai utilisé les termes suivants:

  • champ
  • variable
  • attribut
  • propriété

Y a-t-il une différence entre ce qui précède? Si oui, quel est le terme correct à utiliser? Existe-t-il un terme différent à utiliser lorsque cette entité est persistante?

Réponses:


117

De là: http://docs.oracle.com/javase/tutorial/information/glossary.html


  • champ

    • Un membre de données d'une classe. Sauf indication contraire, un champ n'est pas statique.

  • propriété

    • Caractéristiques d'un objet que les utilisateurs peuvent définir, telles que la couleur d'une fenêtre.

  • attribut

    • Non répertorié dans le glossaire ci-dessus

  • variable

    • Un élément de données nommé par un identifiant. Chaque variable a un type, tel que int ou Object, et une portée. Voir aussi variable de classe, variable d'instance, variable locale.

27
Je ne comprends toujours pas la différence entre un terrain et une propriété?
Koray Tugay

1
@KorayTugay - Regardez un champ comme une donnée rudimentaire liée à un objet. Une propriété (pour moi) est une caractéristique d'un objet qui est visible (et apparemment mutable) par le monde extérieur.
jahroy

Sur la base de ce qui précède, serait-il juste de dire "Les propriétés et les champs sont les mêmes, sauf qu'une propriété est un champ définissable "?
jdurston

2
@John - Peut-être basé sur ce qui précède, qui, comme indiqué, est un copier / coller d'Oracle. Personnellement, je ferais la distinction qu'une propriété est visible publiquement et peut-être mutable, alors qu'un champ pourrait être un champ interne et privé utilisé uniquement par la classe.
jahroy

1
Je pense que la meilleure chose à souligner est que l'existence en tant que champ et propriété ne s'exclut pas mutuellement. De la façon dont cette réponse est formulée, aux nouveaux développeurs, cela ressemble à une liste de choses distinctes.
Kartik Chugh

89

Oui il y a.

La variable peut être locale, de champ ou constante (bien que ce soit techniquement faux). C'est vague comme attribut. De plus, vous devez savoir que certaines personnes aiment appeler des variables finales non statiques (locales ou d'instance)

" Valeurs ". Cela vient probablement des langages JVM FP émergents comme Scala.

Le champ est généralement une variable privée sur une classe d'instance. Cela ne veut pas dire qu'il y a un getter et un setter.

L'attribut est un terme vague. Il peut facilement être confondu avec XML ou API de dénomination Java. Essayez d'éviter d'utiliser ce terme.

La propriété est la combinaison getter et setter.

Quelques exemples ci-dessous

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

}

Il y a beaucoup plus de combinaisons, mais mes doigts se fatiguent :)


3
@Chris Thompson C'est ce qu'Eclipse l'appelle dans l'un de ses dialogues. Hé les gens, c'est Java. Que puis-je vous dire. Cela n'a pas de sens.
Adam Gent

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

@emory Eh bien, c'est le vieil oxymore bien connu. Ce n'est rien de spécifique à Java, ce "problème" remonte au moins jusqu'à C et probablement plus longtemps ... évidemment rien ne vous empêche de l'appeler simplement "constant"
Voo

@AdamGent n'était pas sérieux, ça vous a juste donné du fil à retordre ;-)
Chris Thompson

1
Bonne explication tout en se moquant de la façon dont les noms d'identificateurs peuvent devenir ridiculement longs (et ils sont souvent ridiculement longs).
sargas

5

Si votre question a été posée en utilisant JAXB et que vous vouliez choisir la bonne XMLAccessType, j'avais la même question. Le Javadoc JAXB indique qu'un "champ" est une variable d'instance non statique et non transitoire. Une "propriété" a une paire getter / setter (donc ce devrait être une variable privée). Un «membre du public» est public et est donc probablement une constante. Toujours dans JAXB, un "attribut" fait référence à une partie d'un élément XML, comme dans <myElement myAttribute="first">hello world</myElement>.

Il semble qu'une "propriété" Java, en général, puisse être définie comme un champ avec au moins un getter ou une autre méthode publique qui vous permet d'obtenir sa valeur. Certaines personnes disent également qu'une propriété doit avoir un setter. Pour des définitions comme celle-ci, le contexte est tout.


5

Dietel et Dietel ont une belle façon d'expliquer les champs par rapport aux variables.

"Ensemble, les variables statiques et les variables d'instance d'une classe sont appelées ses champs." (Section 6.3)

«Les variables ne doivent être déclarées en tant que champs que si elles sont requises pour être utilisées dans plus d'une méthode de la classe ou si le programme doit enregistrer leurs valeurs entre les appels aux méthodes de la classe.» (Section 6.4)

Ainsi, les champs d'une classe sont ses variables statiques ou d'instance - c'est-à-dire déclarées avec une portée de classe.

Référence - Dietel P., Dietel, H. - Java ™ How To Program (Early Objects), dixième édition (2014)


3

Si vous prenez des indices d'Hibernate:

Hibernate lit / écrit l'état de l'objet avec son champ. Hibernate mappe également les propriétés de style Java Bean au schéma DB. Hibernate Accédez aux champs de chargement / enregistrement de l'objet. Si le mappage est effectué par propriété, hibernate utilise le getter et le setter.

C'est l'encapsulation qui différencie les moyens où vous avez des getter / setters pour un champ et cela s'appelle propriété, avec cela et nous masquons la structure de données sous-jacente de cette propriété dans setMethod, nous pouvons empêcher les changements indésirables à l'intérieur des setters. Tout ce que signifie l'encapsulation ...

Les champs doivent être déclarés et initialisés avant d'être utilisés. Principalement pour un usage interne à la classe.

Les propriétés peuvent être modifiées par le setter et elles sont exposées par les getters. Ici, le prix du champ a des getter / setters donc c'est une propriété.

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

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

De même en utilisant des champs , [En veille prolongée, c'est la méthode recommandée pour MAP en utilisant des champs, où private int id; est annoté @Id, mais avec Property vous avez plus de contrôle]

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

Le document Java dit: Le champ est un membre de données d'une classe. Un champ est une variable d'instance non statique et non transitoire. Le champ est généralement une variable privée sur une classe d'instance.


2

Les variables sont composées de champs et de non-champs.

Les champs peuvent être:

  1. Champs statiques ou
  2. champs non statiques également appelés instanciations, par exemple x = F ()

Les non-champs peuvent être:

  1. les variables locales, l'analogue des champs mais à l'intérieur d'une méthode plutôt qu'en dehors de toutes, ou
  2. paramètres par exemple y dans x = f (y)

En conclusion, la principale distinction entre les variables est de savoir si ce sont des champs ou des non-champs, c'est-à-dire s'ils sont à l'intérieur d'une méthode ou en dehors de toutes les méthodes.

Exemple de base (excusez-moi pour ma syntaxe, je ne suis qu'un débutant)

Class {    
    //fields    

    method1 {              
         //non-fields    

    }    
}

1

En fait, ces deux termes sont souvent utilisés pour représenter la même chose, mais il existe des situations exceptionnelles. Un champ peut stocker l'état d'un objet. Tous les champs sont également des variables. Il est donc clair qu'il peut y avoir des variables qui ne sont pas des champs. Ainsi, en regardant les 4 types de variables (variable de classe, variable d'instance, variable locale et variable de paramètre), nous pouvons voir que les variables de classe et les variables d'instance peuvent affecter l'état d'un objet. En d'autres termes, si une variable de classe ou d'instance change, l'état de l'objet change. Nous pouvons donc dire que les variables de classe et les variables d'instance sont des champs alors que les variables locales et les variables de paramètres ne le sont pas.

Si vous voulez comprendre plus profondément, vous pouvez vous diriger vers la source ci-dessous: -

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


0

La question est ancienne, mais une autre différence importante entre une variable et un champ est qu'un champ obtient une valeur par défaut lorsqu'il est déclaré. Une variable, par contre, doit être initialisée.


Et une propriété?
Koray Tugay

0

Ma compréhension est comme ci-dessous, et je ne dis pas que c'est 100% correct, je pourrais tout aussi bien me tromper.

Une variable est quelque chose que vous déclarez, qui peut par défaut changer et avoir des valeurs différentes, mais qui peut également être explicitement considérée comme finale. En Java, ce serait:

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

Donc, fondamentalement, une variable est tout ce qui est déclaré et peut contenir des valeurs. La méthode foo ci-dessus renvoie une variable par exemple .. Elle renvoie une variable de type Integer qui contient l'adresse mémoire du nouvel Integer (); Tout le reste que vous voyez ci-dessus sont également des variables, listVariable, aFinalVariableExample et expliqué ici:

Un champ est une variable dont la portée est plus claire (ou concrète). La variable retournant de la portée de la méthode foo n'est pas claire dans l'exemple ci-dessus, donc je ne l'appellerais pas un champ. D'autre part, iAmAlsoVariable est un champ "local", limité par la portée de la méthode foo, et listVariable est un champ "instance" où la portée du champ (variable) est limitée par la portée des objets.

Une propriété est un champ accessible / muté. Tout champ qui expose un getter / setter est une propriété.

Je ne connais pas l'attribut et je voudrais également répéter que c'est ma compréhension de ce que sont les variables, les champs et les propriétés.


0
  • variable- adresse de stockage nommée. Chaque variable a un type qui définit une taille de mémoire, des attributs et des comportements. Il existe pour les types de variables Java: class variable, instance variable, local variable,method parameter
//pattern
<Java_type> <name> ;

//for example
int myInt;
String myString;
CustomClass myCustomClass;
  • field- variable membre ou membre de données. C'est un variableintérieur a class( class variableou instance variable)

  • attribute- dans certains articles, vous pouvez trouver attributequ'il s'agit d'une objectreprésentation de class variable. Objectopère par attributeslequel définir un ensemble de caractéristiques.

CustomClass myCustomClass = new CustomClass();
myCustomClass.something = "poor fantasy"; //something is an attribute of myCustomClass object with a "poor fantasy" value
  • property- field+ borné getter/setter. Il a une syntaxe de champ mais utilise des méthodes sous le capot. Javane le soutient pas sous sa forme pure. Jetez un oeil à Objective-C, Swift,Kotlin

Par exemple Kotlinéchantillon:

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

[Variable Swift, propriété]

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.