2399 votes

Qu'est-ce qu'un JavaBean exactement ?

J'ai compris, je pense, qu'un "Bean" est une classe Java avec des propriétés et des getters/setters.
D'après ce que j'ai compris, c'est l'équivalent d'un C struct . C'est vrai ?

De plus, existe-t-il un véritable syntaxique différence entre un JavaBean et un régulier class ?
Existe-t-il une définition spéciale ou une Interface ?

En fait, pourquoi y a-t-il un terme pour ça ?

Aussi, que fait le Serializable l'interface signifie ?

26 votes

Voir les endroits où Java Beans est utilisé ? . C'est une classe qui suit certaines conventions.

13 votes

Dans un souci d'exhaustivité, voici un lien vers le site Web de la Commission européenne. Spécification des JavaBeans .

7 votes

Juste une note. Si vous entendez des gens utiliser le terme POJO, ils veulent souvent dire Bean. Lorsque vous voyez des POJO, ils ont presque toujours des setters et getters, sont sérialisables, En réalité, un POJO n'a pas besoin de setters et getters, d'une interface sérialisable ou quoi que ce soit d'autre - c'est simplement un Plain Old Java Object sans exigences spécifiques.

2725voto

hvgotcodes Points 55375

Un JavaBean est simplement un standard

  1. Toutes les propriétés sont privées (utiliser récupérateurs/répartiteurs )
  2. Un public constructeur sans argument
  3. Implémente Serializable .

C'est ça. C'est juste une convention. Beaucoup de bibliothèques en dépendent pourtant.

En ce qui concerne Serializable à partir du Documentation de l'API :

La sérialisation d'une classe est activée par la classe implémentant l'interface interface java.io.Serializable. Les classes qui n'implémentent pas cette interface n'auront aucun de leurs états sérialisés ou désérialisés. Tous les sous-types d'une classe sérialisable sont eux-mêmes sérialisables. L'interface de sérialisation interface de sérialisation ne possède ni méthodes ni champs et sert uniquement à identifier la sémantique de la sérialisation.

En d'autres termes, les objets sérialisables peuvent être écrits dans des flux, et donc des fichiers, des bases de données d'objets, n'importe quoi en fait.

De plus, il n'y a aucune différence syntaxique entre un JavaBean et une autre classe : une classe est un JavaBean si elle respecte les normes.

Il existe un terme pour cela, car la norme permet aux bibliothèques de faire des choses de manière programmatique avec des instances de classe que vous définissez d'une manière prédéfinie. Par exemple, si une bibliothèque veut diffuser en continu n'importe quel objet que vous lui passez, elle sait qu'elle le peut parce que votre objet est sérialisable (en supposant que la bibliothèque exige que vos objets soient des JavaBeans appropriés).

252 votes

C'est vrai, à mon avis, presque toute la documentation qui tourne autour des haricots ne peut pas décrire le terme de manière aussi concise que vous l'avez fait. +1

18 votes

Est-il nécessaire que les membres d'un haricot soient également des haricots ? Cela semble être une exigence raisonnable

28 votes

@worldsayshi - Non, ce n'est pas nécessaire. Par exemple un bean peut contenir un String ; et String n'est pas un bean. (String est immuable, donc vous ne pouvez pas le créer en appelant un constructeur vide et un setter). Il semble raisonnable qu'un objet Serializable ait des membres Serializable, à moins qu'il ne les sérialise d'une manière ou d'une autre depuis l'extérieur. Donc non, les membres des Java beans n'ont pas besoin d'avoir un quelconque aspect des Java beans. Bien qu'il soit plus simple si ce sont des haricots, aussi.

387voto

cHao Points 42294

Il y a un terme pour ça, pour que ça ait l'air spécial. La réalité est loin d'être aussi mystérieuse.

En gros, un "haricot" :

  • est un objet sérialisable (c'est-à-dire qu'il met en œuvre l'option java.io.Serializable et le fait correctement), que
  • possède des "propriétés" dont les récupérateurs et les régleurs sont simplement des méthodes portant certains noms (comme, par exemple, getFoo() est le getter pour la propriété "Foo"), et
  • possède un constructeur public à zéro argument (il peut donc être créé à volonté et configuré en définissant ses propriétés).

Quant à Serializable : Ce n'est rien d'autre qu'une "interface de marquage" (une interface qui ne déclare aucune fonction) qui indique à Java que la classe qui la met en œuvre consent à (et implique qu'elle est capable de) la "sérialisation" -- un processus qui convertit une instance en un flux d'octets. Ces octets peuvent être stockés dans des fichiers, envoyés sur une connexion réseau, etc., et contiennent suffisamment d'informations pour permettre à une JVM (du moins, une JVM qui connaît le type de l'objet) de reconstruire l'objet ultérieurement, éventuellement dans une autre instance de l'application, voire sur une toute autre machine !

Bien sûr, pour ce faire, la classe doit respecter certaines limites. La principale d'entre elles est que tous les champs d'instance doivent être soit des types primitifs (int, bool, etc.), soit des instances d'une classe qui est également sérialisable, soit marqués en tant que transient afin que Java n'essaie pas de les inclure. (Cela signifie bien sûr que transient Les champs ne survivront pas au voyage sur un ruisseau. Une classe qui a transient les champs doivent être prêts à les réinitialiser si nécessaire).

Une classe qui ne peut pas respecter ces limites ne devrait pas implémenter Serializable (et, IIRC, le compilateur Java ne va même pas let qu'il le fasse).

1 votes

C'est probablement une question stupide mais, qu'est-ce qu'un champ d'instance pourrait être à part un type primitif ou une instance d'une classe ?

10 votes

@kingfrito_5005 : Ce sera l'un ou l'autre. Mais si c'est une instance d'une classe, il importe que cette classe soit sérialisable ou non. Pour qu'une classe soit sérialisable, il faut que son non transient Les parties doivent être d'un certain type sérialisable.

0 votes

A probablement oublié de mentionner que le constructeur ne doit pas avoir d'arguments . a un constructeur public par défaut (afin qu'il puisse être créé à volonté et configuré en définissant ses propriétés).

120voto

Kamal Points 796

Les JavaBeans sont des classes Java qui respectent une convention de codage extrêmement simple. Tout ce que vous avez à faire est de

  1. mettre en œuvre la java.io.Serializable pour sauvegarder l'état d'une objet
  2. utiliser un constructeur public à argument vide - pour instancier l'objet
  3. fournir des méthodes publiques getter/setter - pour obtenir et définir les valeurs des variables privées (propriétés).

1 votes

Une explication aussi simple est ce que je recherchais. Merci !

75voto

Propriétés des JavaBeans

Un JavaBean est un objet Java qui satisfait à certaines conventions de programmation :

  1. La classe JavaBean doit implémenter soit Serializable o Externalizable

  2. La classe JavaBean doit avoir un constructeur sans argument.

  3. Toutes les propriétés du JavaBean doivent avoir des méthodes publiques setter et getter.

  4. Toutes les variables d'instance de JavaBean doivent être privées

Exemple de JavaBeans

@Entity
public class Employee implements Serializable{

   @Id
   private int id;
   private String name;   
   private int salary;  

   public Employee() {}

   public Employee(String name, int salary) {
      this.name = name;
      this.salary = salary;
   }
   public int getId() {
      return id;
   }
   public void setId( int id ) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName( String name ) {
      this.name = name;
   }
   public int getSalary() {
      return salary;
   }
   public void setSalary( int salary ) {
      this.salary = salary;
   }
}

6 votes

Les annotations sont-elles nécessaires ou font-elles partie d'un Java Bean ?

10 votes

@giannischristofakis Non, les annotations ne sont pas nécessaires. Les annotations sont utilisées dans le cadre de Spring Framework, qui utilise largement les Java Beans.

1 votes

Pourquoi doit-il avoir un constructeur sans argument ?

20voto

Truong Ha Points 1691

Vous trouverez sérialisation utile lors du déploiement de votre projet sur plusieurs serveurs puisque les beans seront persistés et transférés entre eux.

3 votes

Pourriez-vous fournir plus d'informations sur le déploiement d'un projet sur plusieurs serveurs ? Merci.

4 votes

Disons un cluster avec quelques serveurs, pour Websphere ce lien stackoverflow.com/questions/3193345/ pourrait aider.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X