【问题标题】:How do I follow DRY in Java object setter?如何在 Java 对象设置器中遵循 DRY?
【发布时间】:2015-07-11 02:00:37
【问题描述】:
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) 的通用复制方法但不能使其工作。在这里简单介绍如何避免 DRY。

注意:我使用的是jdk7

【问题讨论】:

  • 您的代码似乎无效,不要认为它可以编译(您的复制方法不返回任何内容)。请发布有效的代码以开始。
  • 这是一个设计问题,我想避免 d.copytooc1 () d.copytooc2 () 本质上是相同的代码块。我想避免相同的重复代码。

标签: java dry


【解决方案1】:

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

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

这是您的代码的一个版本,它可以编译并执行您想做的事情:

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

【讨论】:

    【解决方案2】:

    在本例中,child1child2 应该是更通用类的子类。

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

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

    【讨论】:

      【解决方案3】:

      同时保留 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());
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-17
        • 1970-01-01
        • 2017-03-18
        • 2020-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多