0
votes

Existe-t-il un moyen simple d'analyser un objet de la classe A à Object de la classe B, les champs étant un sous-ensemble de A?

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.


2 commentaires

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


3 Réponses :


0
votes

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


0 commentaires

0
votes

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

    }


0 commentaires

1
votes

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


0 commentaires