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

标签 java oop

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

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

首先假设用户只需要基本字段:姓名、年龄、高度。

但稍后另一个用户需要在已使用的字段之上捕获:头发颜色、眼睛颜色和种族

使用字符串、字符串映射可行吗?

我可以创建所有字段

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

但是我的“人”只能通过这些字段来扩展。不确定最佳实践是什么,或者字符串映射是否是路径。任何见解将不胜感激。

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

使用:

Java JSP/Struts2 MySQL 作为数据库。

最佳答案

您可能正在犯一个非常常见的错误,尽管在极少数情况下您可能是正确的。

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

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

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

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

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

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

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

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

关于java - 我应该使用 Map<String,String> 而不是类来创建灵活的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46611703/

相关文章:

Java泛型错误?

java - 移动平台对象 - 使用 box2D 的 Android 游戏

java - 为什么我的 XML 架构无法验证?

javascript - JS面向对象: methods on prototype vs methods in constructor function

php - 构造函数重载

java - 将 ConcurrentHashMap 传递给另一个类的最佳方法?

java - 多类型自定义数组列表

javascript - JS 有时会因计时器困惑而崩溃

python - python中面向对象的构造等价于什么?

java - RxJava2 过滤器列表<对象>