你如何调用一个对象,其状态可以完全用它的字符串表示来描述?

How do you call an object which state can be completely described by its string representation?

OOP 世界中是否有一个名称来指代此类对象?例如,在 java

"Word".toString();

将return输出Word。这是程序中当前存在的实体的字符串表示形式。

可以使用其他数据类型(例如双精度、整数,甚至列表或不同的数据结构)来完成更多示例。

以及其他一些无法以这种方式表示的更复杂的东西,例如完整的 RESTful 服务 class 可能没有其当前状态的字符串表示。

正确的术语是什么?本国的?不变的?最后两个术语并没有真正反映这个定义。

扩展问题:

假设你有一个 function/method 将字符串转换为映射,一个字符串可以是 {key1=value1,key2=value2} 然后你会得到一个映射,这对一些复杂的对象不起作用,如何如果您要将其用于其他简单对象类型,您会描述该函数的参数吗?

你有一个由内部状态组成的抽象对象。

您对该对象的状态有一个或多个具体表示。

在一种情况下,具体表示是一块内存,其中包含基元和对堆上其他组件对象的引用(在 Java 中,其他语言可能不同)。

您有一种不同的表示形式,可以存储在连续的字符或字节块中,并可能通过网络传输。

给定包含非状态信息(方法、class 层次结构等)的等效上下文,这两种表示在规范上是等效的,但它们用于不同的目的。

一般来说,这可以称为 "change of representation"。当上面的第一种表示转换为第二种表示时,它被称为"serialization",逆过程是"deserialization"。请注意,您可以有许多不同的表示来满足不同的要求并支持不同的功能。

需要注意的重要一点是,在内存中和 "serialized"(以及任何其他表示)这两种情况下,如果一个对象的状态包含对其他对象的引用,那么整个 "state"由该对象和可以从该对象到达的所有对象,以及从这些对象可以到达的对象等组成。这被称为 "object graph",它在所有表示中均等存在。

至于决定你应该或不应该使用哪一个,这完全取决于你的处理要求。

for example a full fledged RESTful service class might not have a string representation of its current state

这是不正确的,您始终可以定义对象状态的序列化表示。这样做可能不方便,但是如果需要的话可以做到。

Imagine you have a function/method that converts a string to a map, a string could be {key1=value1,key2=value2} and you would get a map back, this doesn't work for some complex objects

同样,如果需要,它可以总是工作,只要这样做的成本是合理的。

总而言之,一切都是一种表示,您可以安排将一种表示转换为任何其他表示并再次转换回来,而不会造成损失,前提是您愿意承担这样做的费用。如上所述,一个因素是不仅表示单个对象而且表示整个对象图的成本,这可能是巨大的。