web-dev-qa-db-fra.com

Que signifie exactement le terme Objet ancien ancien Java (POJO)?

Que signifie le terme ancien objet Java pur (POJO)}? Je n'ai rien trouvé de suffisamment explicatif.

La page Wikipedia de POJO indique que POJO est un objet Java ordinaire et non un objet spécial. Maintenant, qu'est-ce qui fait ou ne fait pas quelque chose de spécial en Java?

La page ci-dessus indique également qu'un POJO ne devrait pas avoir à étendre des classes pré-spécifiées, implémenter des interfaces pré-spécifiées ou contenir des annotations pré-spécifiées. Cela signifie-t-il également que les POJO ne sont pas autorisés à implémenter des interfaces telles que Serializable, Comparable ou des classes telles qu'Applets ou toute autre classe/interface écrite par l'utilisateur? 

De plus, la politique ci-dessus (pas d'extension, pas d'implémentation) signifie-t-elle que nous ne sommes pas autorisés à utiliser des bibliothèques externes?

Où exactement les POJO sont-ils utilisés?

EDIT: Pour être plus précis, suis-je autorisé à étendre/implémenter des classes/interfaces faisant partie de Java ou de toute autre bibliothèque externe?

67
Nikit Batale

Ancien objet Java simple Le nom est utilisé pour souligner le fait qu'un objet donné est un objet Java ordinaire et non un objet spécial tel que ceux définis par le framework EJB 2.

classe A {} 
classe B étend/implémente C {}

Remarque: B n'est pas POJO quand C est un type de classe d'infrastructure distribuée ou ifc. par exemple. javax.servlet.http.HttpServlet, javax.ejb.EntityBean ou J2EE ext.. et non sérialisable/comparable. Depuis sérialisable/comparable sont valables pour POJO. 

Ici, A est un objet simple, indépendant. B est un objet spécial puisque B étend/implémente C. Ainsi, l’objet B prend plus de sens de C et B est restrictif si vous suivez les règles de C. et B est couplage étroit avec cadre distribué. Donc, l'objet B n'est pas POJO de sa définition.

Code utilisant class Une référence d'objet ne doit rien connaître du type, et peut être utilisée avec de nombreux frameworks.

Ainsi, un POJO ne devrait pas avoir 1) étendre des classes pré-spécifiées et 2) implémenter des interfaces pré-spécifiées.

JavaBean est un exemple de POJO sérialisable, doté d'un constructeur sans argument et permettant l'accès aux propriétés à l'aide de méthodes getter et setter respectant une convention de dénomination simple. 

POJO se concentre uniquement sur la logique métier et ne dépend pas des frameworks (entreprise) ..__ Cela signifie qu'il a le code pour la logique métier mais comment cette instance est créée, À quel service (EJB ..) appartient cet objet Les caractéristiques spéciales (Stateful/Stateless) seront déterminées par les frameworks en utilisant un fichier XML externe. 

Exemple 1: JAXB est le service permettant de représenter un objet Java en tant que XML. Ces objets Java sont simples et proposent des getters et des setters de constructeur par défaut .

Exemple 2: Hibernate où une classe Java simple sera utilisée pour représenter une table. les colonnes seront ses instances .

Exemple 3: services REST. Dans les services REST, nous aurons la couche de service et la couche Dao pour effectuer certaines opérations sur la base de données. Donc, Dao aura des requêtes et des opérations spécifiques au fournisseur. La couche de service sera responsable d'appeler quelle couche DAO exécuter les opérations de base de données. Créer ou mettre à jour les API (méthodes) de DAO consistera à prendre des POJO en arguments, à mettre à jour ces POJO et à insérer/mettre à jour dans la base de données. Ces POJO (classe Java) n'auront que des états (variables d'instance) de chaque colonne et de ses getters et setters.

Dans la pratique, certaines personnes trouvent les annotations élégantes, alors qu’elles voient XML comme un texte prolixe, laid et difficile à maintenir, alors que d’autres trouvent que les annotations polluent le modèle POJO. JPA) permet d’utiliser des annotations à la place ou en complément de XML:

Avantages:
Découpler le code de l’application des frameworks d’infrastructure est l’un des nombreux avantages de l’utilisation des POJO. L'utilisation de POJO permet de mettre à l'épreuve la logique métier de votre application en la dissociant des infrastructures volatiles et en constante évolution. La mise à niveau vers une nouvelle version ou le passage à un cadre différent devient plus facile et moins risqué. Les POJO facilitent également les tests, ce qui simplifie et accélère le développement. Votre logique métier sera plus claire et plus simple, car elle ne sera pas mêlée au code d'infrastructure. 

Références: wikisource2

57

Selon Martin Fowler , lui et quelques autres l'ont proposé comme moyen de décrire quelque chose qui était une classe standard par opposition à un EJB, etc.

10
Grant Crofton

L'utilisation du terme implique ce qu'il est censé vous dire. Si, par exemple, un framework d'injection de dépendance vous indique que vous pouvez injecter un POJO dans n'importe quel autre POJO, ils veulent dire que vous ne devez rien faire de spécial: il n'est pas nécessaire d'obéir à un contrat avec votre objet, d'implémenter des interfaces. ou prolonger des classes spéciales. Vous pouvez simplement utiliser ce que vous avez déjà.

UPDATEPour donner un autre exemple: si Hibernate peut mapper n'importe quel POJO (n'importe quel objet créé) vers des tables SQL, dans Core Data (Objective C sur iPhone), vos objets doivent étendre NSManagedObject pour que le système puisse être capable de les persister dans une base de données. En ce sens, Core Data ne peut fonctionner avec aucun POJO (ou plutôt POOCO = PlainOldObjectiveCObject) alors qu'Hibernate le peut. (Je ne suis peut-être pas 100% correct sur les Core Data depuis que je viens de commencer à le récupérer. Toute astuce/correction est la bienvenue :-)).

7
Benjamin

Ancien objet Java simple :)

Eh bien, vous donnez l'impression que ce sont toutes des restrictions terribles.

Dans le contexte habituel où POJO est/sont utilisés, cela ressemble plus à un avantage:

Cela signifie que toutes les bibliothèques/API avec lesquelles vous travaillez sont parfaitement disposées à travailler avec des objets Java qui n'ont été ni falsifiés ni manipulés, c'est-à-dire que vous n'avez rien à faire pour les faire fonctionner.

Par exemple, le processeur XML XStream (je pense) va sérieusement sérialiser les classes Java qui n'implémentent pas l'interface Serializable. C'est un plus! De nombreux produits fonctionnant avec des objets de données vous obligeaient à implémenter SomeProprietaryDataObject ou même à étendre une classe AbstractProprietaryDataObject. Beaucoup de bibliothèques s’attendront à un comportement de haricot, c’est-à-dire des accesseurs et des setters.

Généralement, tout ce qui fonctionne avec les POJO fonctionnera également avec les non-so-PO-JO. Donc, XStream va bien sûr également sérialiser les classes Serializable.

6
Carl Smotricz

POJO est un simple et ancien objet Java, comparé à quelque chose nécessitant des éléments J2EE (Édition Entreprise) (beans etc ...).

POJO n'est pas vraiment une définition absolue, mais plutôt un moyen manuel de décrire des objets Java «non» normaux. Que ce soit en utilisant une bibliothèque externe ou un framework rend un objet POJO ou non, c'est un peu dans l'oeil du spectateur, cela dépend en grande partie de WHAT library/framework, bien que j'ose penserais qu'un framework ferait quelque chose de moins

4
DVK

Le but d'un POJO est la simplicité et vous semblez supposer que c'est quelque chose de plus compliqué qu'il n'y paraît. 

Si une bibliothèque prend en charge un POJO, cela implique qu'un objet de n'importe quelle classe est acceptable. Cela ne signifie pas que le POJO ne peut pas avoir d'annotations/interface ou qu'ils ne seront pas utilisés s'ils y sont, mais ce n'est pas obligatoire. 

IMHO La page wiki est assez claire. Il ne dit pas qu'un POJO ne peut pas avoir d'annotations/interfaces.

3
Peter Lawrey

Que signifie le terme Objet ancien ancien Java (POJO)?

POJO a été inventé par Martin Fowler, Rebecca Parsons et Josh Mackenzie alors qu'ils se préparaient pour une conférence au cours d'une conférence en septembre 2000. Martin Fowler dans Patterns of Enterprise Application Architecture explique comment implémenter un modèle modèle de domaine en Java. Après avoir énuméré certains des inconvénients liés à l'utilisation de EJB Entity Beans:

Il y a toujours beaucoup de chaleur générée quand les gens parlent de développer un modèle de domaine en J2EE. Beaucoup de matériel pédagogique et Les livres d'introduction à J2EE suggèrent d'utiliser des beans entity pour développer un fichier modèle de domaine, mais cette approche pose de sérieux problèmes, au moins avec la spécification actuelle (2.0).

Les beans entité sont plus utiles lorsque vous utilisez Container Managed Persistance (CMP) ...

Les haricots d'entité ne peuvent pas être ré-entrants. C'est-à-dire, si vous appelez d'un entité bean dans un autre objet, cet autre objet (ou n'importe quel objet qu'elle appelle appelle) ne peut pas rappeler dans le premier entité bean ...

... Si vous avez des objets distants avec des interfaces à grain fin, vous obtenez terrible performance ...

Pour exécuter avec des beans entity, vous avez besoin d'un conteneur et d'une base de données connecté. Cela augmentera les temps de construction et augmentera également le temps effectuer des tests car les tests doivent être exécutés sur une base de données . Les haricots d'entité sont également difficiles à déboguer.

Au lieu de cela, il a proposé d'utiliser Objets Java standard pour la mise en œuvre du modèle de domaine:

L'alternative consiste à utiliser des objets Java normaux, bien que cela se produise souvent provoque une réaction surprise - il est étonnant de voir combien de personnes pensent cela vous ne pouvez pas exécuter des objets Java normaux dans un conteneur EJB. Je suis venu à la conclusion que les gens oublient les objets Java normaux parce que ils n'ont pas un nom de fantaisie. C'est pourquoi, tout en se préparant pour une conversation en 2000, Rebecca Parsons, Josh Mackenzie et moi leur en avons donné un: les POJO (vieux objets Java simples). Un modèle de domaine POJO est facile à assembler, est rapide à construire, peut être exécuté et testé en dehors d’un conteneur EJB, et est indépendant d’EJB (c’est peut-être pour cette raison que les vendeurs d’EJB ne vous encouragent pas à les utiliser).

0
Ali Dehghani

Un objet POJO (Plain Old Java Object) contenant toute la logique applicative de votre extension.

Exp. Pojo qui contient une seule méthode

public class Extension {
   public static void logInfo(String message) {
      System.out.println(message);
   }
}
0
Sandeep Kumar