public class Person
{
    protected Map<String, String> data;

    public String getString(String key)
    {
        return getData().get(key);
    }

    public void setString(String key, String val)
    {
        getData().put(key, val);
    }
}


我想要一个灵活的对象,该对象可以更改并最终具有新字段,或者根据用户需求最终不使用字段。

首先说用户只需要基本字段:名称,年龄,身高。

但是后来,另一个用户需要在已经使用的字段上方捕获:头发颜色,眼睛颜色和种族

使用String,String映射是否可行?

我可以创建所有字段

int age;
int height;
String name;
String eyeColor;
...


但是我的“人员”只能扩展到这些领域。不确定最佳做法是什么,或者不确定字符串映射是否为路线。任何见识将不胜感激。

好吧,该项目是用于保险目的的原始应用程序。每个分支公司以不同的方式存储驱动程序,并以不同的方式使用驱动程序信息,因为捕获了哪些数据字段,哪些没有捕获。有些记录了某人发生过多少次事故,有些则没有。有些要求驾驶多年,需要驾驶员等级,而有些则不需要。我不确定制作一个灵活的对象的最佳设计实践,该对象可以扩展到每个分支公司的情况,而无需创建多个驱动程序扩展的对象,因为每次有新的载体出现时,我都需要一个新的对象来满足他们的需求

使用:

爪哇
JSP / Struts2
MySQL作为数据库。

最佳答案

尽管在狭窄的情况下您可能是正确的,但是您可能正在做的是犯一个非常普遍的错误。

您认为创建一个新类会增加应用程序的复杂性和开销,而避免创建一个新类会使其变得更简单。事实并非如此,反而很有可能。上课可以使生活更轻松:这就是为什么他们被发明的原因。

如果需要为每个分支公司添加的这些字段要求您编写使用它们的逻辑,那么您将不得不从映射中提取这些字段并将其放入变量中,然后编写一些逻辑来操作它们。由于您没有课程,因此您将没有任何封装该逻辑的方法(如果这样做很有意义)。您将无法键入该字段(它是数字,字符串还是布尔值)。除了明确检查之外,您将没有任何其他方法来知道Map是否包含该字段。您将没有简单的方法来查看地图的类型。您将必须转换所有内容。

例如,假设您需要在类中为分支添加“年龄”字段。在Java中,您可以为该分支创建一个类,添加一个int字段,然后为其编写逻辑。您还可以使用各种OO技术来处理类似的类(例如,使用getAge()方法创建接口)。

另外,不要以为扩展类总是添加额外数据的正确方法。有时,使用具有关联数据的一个或多个附加类是更好的方法。

在Map语言中,您将获得String,检查是否存在(可能为null)将其转换为int,处理可能的解析异常。所有这些逻辑必须在某种实用程序类或某种帮助程序中浮动。它将看起来很糟糕,并且您仍然拥有临时int,而且您最终可能会得到分支逻辑的帮助者,分支逻辑仍然是一个类。

如果您只是在不做任何逻辑的情况下仅将属性显示在屏幕上,则可能适合使用Map。在这种情况下,使用名称/值对(您正在执行的操作的通用模式)并编写一些可以显示任何内容的通用逻辑可能是最容易的。

影响您选择的另一个因素是是否使用某些Hibernate类型的东西来持久化对象。如果是这种情况,那么拥有多个类将倾向于导致更多数据库表(尽管可以避免)。这可能是好是坏。对于DBA来说,它将更为复杂,但是,另一方面,如果分支特定的数据在正确的表中而不是某些NVP结构中,则查看和搜索分支特定的数据将更加容易。

总结:不要以为具有更多类的解决方案会更复杂。

10-01 08:15