我应该使用Map <string,string>而不是类来创建灵活的对象吗?

时间:2017-10-06 18:16:02

标签: java oop

_CKAccountChangedNotification

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

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

但是后来另一个用户需要捕捉:头发颜色,眼睛颜色,&amp;种族,在已经使用的领域之上

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

我可以创建所有字段

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

但是我的人物&#34;只能通过这些领域延伸到目前为止。不确定最佳做法是什么,或者字符串映射是路由go。任何见解都将不胜感激。

该项目是一个用于保险目的的crud应用程序。每个分支公司以不同方式存储驱动程序,并以不同方式使用驱动程序信息,因为捕获的数有些人捕获了有多少人发生过的事故,有些则没有。有些需要多年驾驶,驾驶员等级,而有些则不需要。我不确定制作灵活对象的最佳设计实践,它扩展到每个分公司的案例,而不创建多个驱动程序扩展对象,因为每次有新的载体进入时,我需要一个新的对象来满足他们的需求

使用:

爪哇 JSP / Struts2的 MySQL作为DB。

1 个答案:

答案 0 :(得分:1)

你可能正在做的是犯了一个非常常见的错误,尽管在某些情况下你可能是正确的。

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

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

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

此外,不要假设扩展类始终是添加额外数据的正确方法。有时附加一个类或相关数据的类是一种更好的方法。

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

您的Map可能适合的情况是您只是在屏幕上显示属性而不做任何逻辑。在这种情况下,最简单的方法就是使用名称 - 值对(你正在做的一般模式)并编写一些可以显示任何内容的通用逻辑。

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

总结:不要假设有更多类的解决方案更复杂。