【问题标题】:Stateless Objects good practice or not [closed]无状态对象的好习惯与否[关闭]
【发布时间】:2013-12-30 00:54:18
【问题描述】:

这是我对无状态对象的理解:任何从没有类变量的类创建的对象都是无状态对象。 我的问题是我们什么时候应该编写无状态类。拥有无状态对象是一个好习惯吗?

【问题讨论】:

  • 何时需要它们?或者,更准确地说,当您不需要(暴露的)状态时。
  • 我想说什么时候需要,什么时候不需要。如果它没有状态,我们为什么要写这些。会类似于函数式编程吧?
  • (例如,看看 java.lang.Math:让它成为一个有状态的类,这样你必须创建一个 Math 的实例来计算余弦是否有意义?)跨度>
  • 您可能希望将静态实用程序方法放在单独的类中。
  • 您对“无状态对象”的定义是错误的:通常“类变量”(或类成员)指的是静态成员。但是,您所说的似乎是“实例变量”。

标签: java class oop object stateless


【解决方案1】:

如果您需要“将功能作为参数传递”,无状态对象非常有用。由于函数在java中不是对象,因此以函数作为参数传递对象是一种实用的方法。

例如Comparators 可用于排序,如果一个类没有实现Comparable,或者如果您需要支持使用不同定义的“

工厂(参见http://www.oodesign.com/factory-pattern.html)可能是无状态对象。工厂的所有功能都可以创建对象和创建所需的所有参数 它们可以作为工厂函数的参数给出。

【讨论】:

    【解决方案2】:

    一般来说,如果你所拥有的是无状态的(没有实例变量,只有类变量),它没有理由被实例化并且不应该是一个对象(尽管将它作为一个类来实现对相关的组很有用功能并管理对静态类变量的访问)。

    在我看来,无状态对象是合理的一种情况是,它是一个简单的接口实现。例如,一个不可变的 Collection(例如 EmptyCollection)可能希望成为一个对象,以便它可以像其他 Collection 对象一样被传递和操作,但可以实现为无状态,因为它是不可变的并且它的状态永远不会改变。

    【讨论】:

    • 那将是不可变的,但不是无状态的。您可能实现真正的无状态对象的一种情况是您希望将“行为”作为参数传递,而没有任何关联的“状态”。例如,您可能有一个包,您可以在其中传递几种不同的排序行为之一。
    • 人们可以质疑不可变行为是否可以或不能被视为任何合理意义上的“状态”——“返回 0”通常不被视为状态——但我同意你的观点;无论如何,这是一个更好的例子。
    • 字符串无疑是一个有状态的对象,但不可变。
    • 同意。不变性是不够的。虽然如果你正在实现一个 CharSequence 版本——按照类设计——总是看起来有值“Foo”,我会称之为无状态,因为你甚至不能在 c'tor 时间设置它。硬编码常量对象有时是有用的优化。我们同意捆绑行为对象是一个更好的例子。
    猜你喜欢
    • 1970-01-01
    • 2016-04-26
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 2021-03-15
    • 2018-12-12
    相关资源
    最近更新 更多