水合物体意味着什么?

时间:2011-08-09 03:41:40

标签: java oop

当有人谈论保湿物体时,这是什么意思?

我在Web上看到一个名为Hydrate的Java项目,它在不同的表示形式之间转换数据(RDMS到OOPS到XML)。这是物体水化的一般含义;在表示之间转换数据?这可能意味着从存储的表示中重建对象层次结构吗?

5 个答案:

答案 0 :(得分:187)

水合作用是指用数据填充对象的过程。尚未被水合的对象已被实例化,并且表示具有数据的实体,但数据尚未加载到对象中。这是出于性能原因而做的事情。

此外,在讨论从数据库或其他数据源加载数据的计划时,使用术语水合作用。以下是一些例子:

当你只将一些字段加载到其中时,你可以说一个物体是部分水合的,但不是全部。这可以完成,因为当前操作不需要其他字段。因此,没有理由在不使用时浪费带宽和CPU周期加载,传输和设置这些数据。

此外,还有一些ORM,例如Doctrine,它们在实例化时不会对象进行水合,但只有在该对象中访问数据时才会如此。这是一种有助于不加载不会被使用的数据的方法。

答案 1 :(得分:90)

关于更通用的术语 hydrate

保护对象正在获取存在于内存中的对象,该对象尚未包含任何域数据(“真实”数据),然后使用域数据(例如来自数据库,来自网络)或来自文件系统)。

来自Erick Robertson对这个答案的评论:

  

反序列化==实例化+水合作用

如果您不需要担心性能飙升,并且您没有调试数据访问API内部的性能优化,那么您可能不需要明确处理水合作用。您通常会使用deserialization,因此您可以编写更少的代码。有些数据访问API没有为您提供此选项,在这些情况下,您还必须自己明确调用水合步骤。

有关水合作用概念的更多细节,请参阅同一问题的Erick Robertson's answer

关于the Java project called hydrate

你特意询问了这个框架,所以我调查了它。

据我所知,我不认为这个项目在一般意义上使用了“水合物”这个词。我认为它在标题中的用法是“序列化”的近似同义词。如上所述,这种用法并不完全准确:

请参阅:http://en.wikipedia.org/wiki/Serialization

  

将数据结构或对象状态转换为可以在相同或另一个计算机环境中存储和重建的格式。

我无法直接在the Hydrate FAQ找到他们名字背后的原因,但我得到了他们意图的线索。我认为他们选择了“Hydrate”的名称,因为该库的目的与流行的类似Hibernate framework的类似,但它的设计考虑了完全相反的工作流程。

大多数ORM,包括Hibernate,采用面向内存的面向对象模型的方法,数据库需要考虑。 Hydrate库采用面向数据库模式的方法,保留您的关系数据结构,让您的程序更加干净地工作。

隐喻地说,仍然关于这个图书馆的名字: Hydrate 就像“制作一些可以使用的东西”(如重新补水Dried Foods)。它与 Hibernate 的隐喻相反,更像是“为冬天放些东西”(如Animal Hibernation)。

据我所知,决定命名库Hydrate并不关心通用计算机编程术语“水合物”。

当使用通用计算机编程术语“水合物”时,性能优化通常是动机(或调试现有的优化)。即使库支持对对象填充数据的时间和方式进行精细控制,时间和性能似乎也不是名称或库功能的主要动机。该库似乎更关注实现端到端映射和模式保存。

答案 2 :(得分:40)

虽然Merlyn提到它有点冗余,但根据我的经验,它指的是来填充/填充对象,而不是实例化/创建它,所以当你需要时它是一个有用的词精确。

答案 3 :(得分:1)

这是一个非常老的问题,但是似乎对以下术语的含义仍然感到困惑。希望这将消除歧义。

水合

当您看到描述中写着“正在等待数据的对象正在等待水化”之类的描述时,这会造成混乱和误导。对象不需要等待,水合作用只是用数据填充对象的行为。

以JavaScript为例:

const obj = {}; // empty object
const data = { foo: true, bar: true, baz: true };

// Hydrate "obj" with "data" 
Object.assign(obj, data); 
console.log(obj.foo); // true
console.log(obj.bar); // true
console.log(obj.baz); // true

任何将值添加到obj的东西都是在“滋润”它。在此示例中,我仅使用Object.assign()

序列化

console.log(JSON.stringify({ foo: true, bar: true, baz: true }));

反序列化

console.log(JSON.parse('{"foo":true,"bar":true,"baz":true}'));

答案 4 :(得分:0)

在 PHP 中,您可以根据其名称创建一个新类,而无需调用构造函数,如下所示:

require "A.php";
$className = "A";
$class = new \ReflectionClass($className);
$instance = $class->newInstanceWithoutConstructor();

然后,您可以对调用 setter(或公共属性)进行 hydra 化