使用集合而不是类

时间:2017-01-24 17:00:32

标签: java android oop

我在java中有一个Web服务,在我的网站上我需要显示一些报告。带有标题和数据的表。这些报告也将在Android应用中显示。 问题是,对于每个报告,都是关于不同的东西,比如关于汽车和其他关于狗的报告,我需要创建一个模型类来正确地做到这一点吗?

例如(这是一个简单的例子),如果我需要显示关于汽车的统计数据,我可能有一个像这样的java对象:

public class CarStats {
    private String carName;
    private String carModel;
    private int unitsSold;
}

因此,在我的网站和Android应用中,我需要实现一个包含特定标头的表。在我看来,这似乎是正确的方法,因为我认为这种方法遵循OO。

另一方面,如果我想制作这个通用的,那么最好使用这样的对象:

public class GenericData {
    private List<String> headers;
    private List<List<String>> data;
}

使用这种方法我只需要在我的网站和Android应用程序中创建一个唯一的表来处理这个对象,无论我正在显示什么数据(更容易)。

但是第二种方法对我来说并不合适。我想知道哪种方法更好。

这两种方法的优点和缺点是什么?

感谢。

4 个答案:

答案 0 :(得分:1)

我认为“通用”的两个含义已经混淆了。一个是Java泛型,例如使用参数化类型<T>。另一种是普通意义上的通用英语。您可能需要第二个,而不是第一个。从这个意义上说,泛型意味着你创建了一种适合不同数据的结构,而不是<T>事物。

例如,您可以创建一个通用的Stat或Data类(而不是CarStat)(您选择了相应的名称)。

public class Report {
    private String header;
    private String data;
    ...
    private String footnote;
    ...
}

Report carReport = Report ("Car", "Data about the car ...", ...); 
// send carReport to be presented.
...
Report dogReport = Report ("Dog", "Data about the dog...", ...); 

现在,在您的表示层中,您只关心表的结构。然后,您可以呈现Web服务提供的任何内容,而无需担心它是汽车还是狗或其他什么。

答案 1 :(得分:0)

如果你有不同的实体&amp;计划制作单个类,然后所有实体应具有相同的结构。如果你有一辆Car&amp;一只狗。你的CarStats类有carName,carModel等。但是对于Dog类你肯定会有不同的字段吗?而不是carModel你将拥有dogBreed&amp;狗的年龄属性。

public class Car {
    private String carName;
    private String carModel;
    private int unitsSold;
}

for Dog

public class Dog {
    private String dogName;
    private String dogBreed;
    private int numAdopted;
    private int age;
}

仅当所有不同的实体类具有相同的类属性时才会然后创建Generic类的方法很有意义。

答案 2 :(得分:0)

  

这两种方法的优点和缺点是什么?

您不应该使用第二种方法来解决此类问题。 Java中Collection的目的是将一组相关对象放在一起。另一方面,类是创建其他对象的蓝图。这些对象可以放在Collection中,但不能替换它们。

就使用类而不是Collection的优点而言,有很多,但只有一个简单的例子足以覆盖它们:

public class CarStats {
    private String carName;
    private String carModel;
    private int unitsSold;

    public void setName(String carName) { 
          if(name==null || name.isEmpty())  {
              System.out.println("name cannot be empty"); 
          }
    }

    public void toString() {
         return "Name : "+carName+" "+carModel+"unitsSold "+unitsSold;
    }

}

看起来很简单,上面的代码中发生了很多事情。命名变量,封装,模块化,可读性,自给自足等。使用Collection时,您将如何实现这些目标?

假设你仍然决定采用第二种方法,下面的代码应该足以让你重新考虑:

<强> 1。使用课程时的用法:

Car car = new Car();
String name = getNameFromSomewhere();
car.setName(name);
System.out.println(name);

<强> 2。使用集合时的用法

GenericData data = new GenericData();
genericData.getHeaders().add("name","model","unitsSold");
String name = getNameFromSomewhere();
genericData.getData().get(0).add(name);
System.out.println(genericData.getData().get(0).get(0));

答案 3 :(得分:0)

我认为这取决于您的数据。也许如果你只为汽车和狗展示桌子,你应该为他们上课。但是,如果您的应用不关心差异,您可能不应该在应用中实现它们。如果您的应用只显示一个表格,那么您应该将“表格”作为您的对象实现并显示它。服务器可以只为您提供一个TableMessage,如果您需要Car和Dog的表示,那么服务器可以知道这一点并进行映射。这样做的另一个好处是,您可以在以后添加新数据实体而无需触及客户端。

相关问题