【问题标题】:Best Practices: Map object properties from string collection最佳实践:从字符串集合映射对象属性
【发布时间】:2012-09-15 06:07:32
【问题描述】:

我有这个 Java 应用程序,我正在使用 JSoup 库进行一些网络抓取。我正在使用该库,它返回了其中 6 个字符串的集合。我需要将这 6 个随机字符串映射到对象的属性。我知道字符串的输入顺序以及什么数字映射到什么属性。我不觉得我的方法是处理这个问题的最好方法。感觉很迷茫,可读性很差,我只是想知道是否有更好的方法来做到这一点。我正在考虑使用枚举或单独使用这些行。长话短说,这里有一个代码 sn-p。感谢您的帮助。

List<String> strings = JSoup.getStrings();
Car car = new Car();
int i = 0;
for(String s : strings) {
    switch (i) {
        case 0:
            car.setMake(s);
            break;
        case 1:
            car.setModel(s);
            break;
        .....
    }
    i++;
}

【问题讨论】:

  • 呃,这段代码不会只有两次效果吗?第三次i == 3,你没有case语句或默认处理那个。
  • 对不起!已编辑。想象一下下面还有 4 个 Case 语句:)

标签: java android oop properties


【解决方案1】:

由于这个问题是关于最佳实践的,您应该考虑在 Car 中提供一个将字符串列表作为输入的构造函数。然后构造函数将从字符串列表中一一初始化汽车的字段,因为这就是构造函数的用途。这意味着用于填充汽车实例的代码现在将位于一个位置,即在 Car 类中。

这种方法将消除创建 Car 实例的代码手动初始化 Car 实例的需要。无论有多少不同的类创建一个 Car,初始化代码都不会在每个类中重复。将初始化代码放在汽车本身可以提高可重用性。这不就是编写类的目的吗?

【讨论】:

    【解决方案2】:

    简单点怎么样

    car.setMake(strings.get(0));
    car.setModel(strings.get(1));
    ...
    

    对我来说,这看起来非常可读和简单。

    【讨论】:

      【解决方案3】:

      我会这样写:

      List<String> strings = JSoup.getStrings();
      if (null == strings || strings.isEmpty() || MAX_SIZE != strings.size()) {
          throw new IllegalArgumentException("I don't know what you are talking about!");
      }
      Car car = new Car();
      car.setMake(strings.get(0));
      car.setModel(strings.get(1));
      ...
      

      代码的读者很清楚,我希望列表中只有这么多值,每个元素都是汽车的特定属性。当一个新的属性被添加时,异常会让修改器知道他必须在这里做一些事情来处理这个新的属性。

      【讨论】:

        猜你喜欢
        • 2011-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-14
        • 2021-07-24
        • 1970-01-01
        • 2013-01-26
        • 1970-01-01
        相关资源
        最近更新 更多