如何在Java对象设置器中跟踪DRY?

时间:2015-07-10 17:46:19

标签: java dry

import java.util.HashMap;
import java.util.Map;

public class parent {
}

public class child1 extends parent {
  private String id;
  private String name;
  // getter & setter
}

public class child2 extends parent {
  private String id;
  private String name;
  // getter & setter
}

public class demo {
  public child1 copytoc1(Map m, child1 c) {
    c.setid(m.get("id"));
    c.setName(m.get("name"));
  }

  public child2 copytoc2(Map m, child2 c) {
    c.setid(m.get("id"));
    c.setName(m.get("name"));
  }

  public static void main(String args[]){
        demo d =new demo();
        Map m=new HashMap();
        m.set("id","1");
        m.set("name","1name");
        d.copytoc1(m,new child1);
        m.set("id","2");
        m.set("name","2name");
        d.copytoc1(m,new child2);
  }
}

我想避免绑定对象类型的copytoc1copytoc2方法想要编写类似public T copy(Map m, T t)的通用复制方法,但无法使其工作。这里简单地说如何避免干旱。

注意:我使用的是jdk7

3 个答案:

答案 0 :(得分:2)

不为不同的孩子开设不同的课程,你不会重复自己。

类是对象的类型。通过拥有一种类型的孩子的多个实例,您可以拥有更多孩子。

这是您的代码的一个版本,它编译并执行您想要执行的操作:

import java.util.HashMap;
import java.util.Map;

public class Demo {
  public static class parent {
  }

  public static class child {
    private String id;
    private String name;
  }

  public void copyToChild(Map<String, String> m, child c) {
    c.id = m.get("id");
    c.name = m.get("name");
  }

  public static void main(String args[]) {
    Demo d = new Demo();
    Map<String, String> m = new HashMap<>();
    m.put("id", "1");
    m.put("name", "1name");
    d.copyToChild(m, new child());
    m.put("id", "2");
    m.put("name", "2name");
    d.copyToChild(m, new child());
  }
}

答案 1 :(得分:0)

在此示例中,child1child2应该是更通用的类的子代。

在那里你可以实现公共集,并在每个孩子中具体细节。那么,当你想做copytoc1时,你会这样做:

public child1 copytoc1(Map m, child1 c) {
    copytoc(m,c); //a parent method.
    // especific methods:
    c.setName(m.get("name"))
  }

答案 2 :(得分:0)

同时保留child1和child2,但将变量移动到父项中,因为它们是相同的变量

public class demo {
    static class parent {
        private String id;
        private String name;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    static class child1 extends parent {

    }

    static class child2 extends parent {

        // getter & setter
    }

    public parent copy(Map m, parent c) {
        c.setId((String) m.get("id"));
        c.setName((String) m.get("name"));
        return c;
    }

    public static void main(String args[]) {
        demo d = new demo();
        Map m = new HashMap();
        m.put("id", "1");
        m.put("name", "1name");
        child1 c1 = new child1();
        d.copy(m, c1);
        m.put("id", "2");
        m.put("name", "2name");
        parent p = d.copy(m, new child2());
        System.out.println(p.getName());
    }
}