我在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应用程序中创建一个唯一的表来处理这个对象,无论我正在显示什么数据(更容易)。
但是第二种方法对我来说并不合适。我想知道哪种方法更好。
这两种方法的优点和缺点是什么?
感谢。
答案 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的表示,那么服务器可以知道这一点并进行映射。这样做的另一个好处是,您可以在以后添加新数据实体而无需触及客户端。