- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在考虑在Java中使用对象的不同表示形式,以提供更大的灵活性。我最大的需要是动态地通过系统传递数据,以便在系统中的某个时刻使用脚本引擎进行处理。
我的问题是仅将对象表示为Map<String, Object>
是否不是一个好主意。例如,如果我要继续前进,我将来会为自己创建一些严重的问题吗?这样做本质上是一个坏主意,为什么?等等...
例如,我可以像这样实现它
public class Foo {
private final Map<String, Object> data;
public Foo ()
{
this.data = new HashMap();
}
public String getProperty1() { return this.data.get("property1"); }
public int getProperty2() { return this.data.get("property2"); }
public Object getDynamicData(String key) { return this.data.get(key); }
//Use builder to set properties in data and create the Foo object...
}
public class Foo {
private final String property1;
private final int property2;
private final Map<String, Object> dynamicData;
public Foo (String property1, int property2, Map<String, Object> data)
{
this.property1 = property1;
this.property2 = property2;
this.dynamicData = data;
}
public String getProperty1() { return this.property1; }
public int getProperty2() { return this.property2; }
public Object getDynamicData(String key)
{
return this.dynamicData.get(key);
}
}
最佳答案
我最大的需要是在系统中的某个点上动态地通过系统传递数据以使用脚本引擎进行处理……我的问题是,单纯地将对象表示为Map<String, Object>
是否不是一个坏主意,例如会继续前进吗,我将来会为自己创建一些严重的问题吗?这样做本质上是一个坏主意,为什么?
我认为这是对您的问题的一种完全合法的解决方法,对于许多信息处理问题而言,这比许多实际问题要多。将模型信息集映射为它们的信息集。
信息的意思是“具有意义的数据”(即使头脑具有“形式”)。具有有意义命名的键的单个值(在映射中)实际上是一条信息。
(开放)集是不同元素(例如键-值对)的集合,仅此而已。
首先,商务人士将信息集视为字面上的信息集-通常在电子表格,纸质表格或屏幕中。他们不认为它们是具有“行为”的活呼吸对象,应该以某种方式“与信息紧密地结合在一起”。 (如果您确实认为自己的业务公理或不变量覆盖了您认为值得在有状态对象中实现的信息项,请填充靴子,但是,将相同的不变性同样容易地应用于通过地图的无状态对象方法中,而且更容易命名。)
同样,为单个信息项(例如“ customerForename”或“ productId”或“ lineItemQuantity”)查找基于域名的长期有效名称要比为业务“实体”寻找长期存在的名称和合同要容易得多”。例如,假设您一开始就将信息集命名为“客户”,但是现在输入的信息集中既包含客户信息,也包含一些订单信息。您是否应该将信息分解为单独的“客户”和“订单”对象,以期有一天分离能获得回报。从理论上讲,Order具有LineItem对象的列表,但LineItems不应同时包含“ productId”和“ productTitle”以便在其他上下文中可重复使用,但是我的信息集没有“ productTitle”,因此也许它们应该是可选的吗?我该如何验证?等等等等。...现在,我的信息集分布在三个DTO(也许在不同的包装中),只是为了惯用地捕获此单个信息集。建模练习永远无法完全满足不断变化的需求,变得越来越耦合,并且变得越来越难维护-收益很少。
或者,您可以只将Customer和Orders信息填充到与以前仅用于Customer信息的地图相同的地图中-再次使用精心挑选的长期键名来指定地图中包含的新信息。他们在一起-为什么不把他们在一起。如果您需要将它们拆分为单独的地图,请执行此操作。映射(真正的集合)易于拆分,合并,增长和缩小,而不会对它们代表的内容产生精神分裂症-因为与POJO / DTO不同,它们不会对应该包含的内容做出艰难的选择,这会使代码难以生存使用它们。不再需要对信息集中的字段进行不间断的更改,而是尝试删除POJO构造函数的第三个参数,而不会在整个生产和测试代码中引起编译问题。
另外,如果要从一个信息集转换为另一信息集,请尝试在同一地图中累积转换后的数据。毕竟,您不是只是在旧信息的基础上添加新信息吗?如果以后需要分开可以。在过去,客户保留纸质申请表,并在其后附加任何内部信件/决定(带回形针),而不是替换它。这意味着可以在仅引用其关注的地图中数据的流水线中逐步应用处理规则,并且该地图会慢慢积累更多信息。这样就可以轻松地细分和添加(和测试)规则,而不必携带不必要的额外信息,也不会在信息集增长或收缩时无处不在打破合同。
它不是OO-但这并不是避免它的唯一原因。但是,它是许多其他语言(OO语言或其他语言)中的惯用方法。 Javascript的对象只是映射。 Groovy,Ruby和Python都看到了本机map / hash / dictionary类型结构的普遍使用。 Clojure自觉地将地图(列表和集合,具有统一的“ seq”抽象)包含为通过函数传递的所有信息的无处不在的集合,这是出于这些良好的原因以及其他原因。的确,所有这些都是动态语言,而谦虚的java.util.Map可能很难用于此类模式,因为通常需要进行类转换(除非您提前知道地图将始终包含的内容),并且没有optional ()等。更重要的是,您不能再简单地使用IDE自动完成功能来告诉您类中有哪些可用信息(赞!)。然而,回报是存在的。
这些要点中的大多数都是Clojure社区中精通的主题,但我希望Java社区中也有更多关于这些主题的讨论:)
关于java - Java Map Object,以 map 表示的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46472740/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!