example:
B parseToB(A a){ B b = new b(); b.setAa(a.getAa()); b.setBb(a.getBb()); return b; }
Bien sûr, mes classes réelles sont plus grandes avec plus de 15 champs, qui sont également des objets complexes en eux-mêmes. maintenant je fais
class A{ String aa; String bb; String cc; String dd; } class B{ String aa; String bb; }
Existe-t-il un moyen facile d'analyser A à B? Une bibliothèque ou une classe de mappage intégrée? Cela ressemble à un endroit étrange dans mon code où je ne fais que mettre 15 lignes de code.
3 Réponses :
Vous pouvez par exemple fournir un constructeur dans la classe B
qui accepte A
comme paramètre:
class B { String aa; String bb; public B() { } public B(A a) { this.aa = a.getAa(); this.bb = a.getAa(); } }
Et ensuite vous pouvez créer un nouvelle instance de B à partir de A en appelant simplement le constructeur:
B newObject = new B(a);
N'oubliez pas que si vous voulez créer une nouvelle instance de la classe B sans paramètre, vous devez également ajouter le constructeur vide (qui peut être omis s'il n'y a pas d'autres constructeurs):
class B { String aa; String bb; public B(A a) { this.aa = a.getAa(); this.bb = a.getAa(); } }
Vous pouvez utiliser la réflexion. Essayez ceci:
static class A { String aa, bb; Integer cc; Boolean dd; } static class B { String aa, bb; Integer cc; Integer dd; @Override public String toString() { return "B{" + "aa=" + aa + ", bb=" + bb + ", cc=" + cc + ", dd=" + dd + '}'; } } public static void main(String []args) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException { A a = new A(); a.aa = "aa"; a.bb = "bb"; a.cc = 10; a.dd = true; B b = new B(); for (Field declaredField : b.getClass().getDeclaredFields()) { if (a.getClass().getDeclaredField(declaredField.getName()) != null // both class have a field with the same name && a.getClass().getDeclaredField(declaredField.getName()).getType() .equals(declaredField.getType())) { // and the fields are of the same type declaredField.set(b, a.getClass().getDeclaredField(declaredField.getName()).get(a)); } } System.out.println(b); }
Personnellement, j'utilise MapStruct dans mes projets pour ce genre de choses, il fournit une manière flexible et agréable de déclarer des mappages simples et fournit également de bonnes extensions pour des types de mappages complexes.
Donc, pour votre exemple, vous pouvez simplement définir une interface ( ou classe abstraite)
A firstObject = new A(); //Set your variables B secondObject = ObjectMapper.INSTANCE.mapToB(firstObject);
Vous devrez configurer un processeur d'annotations pendant votre cycle de construction (si vous utilisez maven), puis vous pouvez simplement appeler le mappeur dans votre code
@Mapper public interface ObjectMapper { ObjectMapper INSTANCE = Mappers.getMapper(ObjectMapper.class); A mapToA(B b); B mapToB(A a); }
vous ne pouvez pas analyser les deux, car il n'y a pas de relation hiérarchique. Ce n'est pas parce que ces variables ont le même nom qu'elles sont liées. Vous pouvez cependant les cartographier.
À tout le moins, vous devriez fournir un constructeur de copie ou similaire au lieu d'avoir une douzaine de setters publics. Ou pour une recherche de solution automatique pour "objet à objet mappeur". stackoverflow.com/questions/3319002/automapper-for-java