【问题标题】:Do we need static fields in Spring Beans?我们需要 Spring Beans 中的静态字段吗?
【发布时间】:2018-11-19 08:41:52
【问题描述】:

我已经看到将 Logger 实例创建为使用任何 Spring 注释 (@Component@Service) 注释的类的静态属性的一般做法。

因此,默认情况下,所有创建的 bean 本质上都是单例的。我们真的需要这个 scnerio 中的静态字段,因为毕竟只有一次实例吗?

【问题讨论】:

  • 将其设为静态有什么害处?如果它从一个组件变为您多次实例化的东西,那么您需要记住将其恢复为静态以避免创建不必要的记录器实例。如果我这样做了,我肯定我会忘记的。此外,一致性。
  • 静态对象可以在没有对象初始化的情况下访问,单例不能。因此,它们的目的完全不同。
  • Spring @Components 也可以是 @RequestScoped。在那种情况下,它们不会是单例,所以你的第一个假设并不完全正确。
  • @Michael 如果构建失败,您将如何在单例构建过程中记录一些内容:-)?
  • @dognose 构造函数通常可以访问非静态记录器,前提是它们以常规方式声明。我删除了我的评论,因为我想您可能想要记录一个静态方法,但显然并非所有类都有它们

标签: java spring spring-framework-beans


【解决方案1】:

我认为同样的问题也可以用于 final:“如果我知道我不会在代码中触及它,为什么还要将变量声明为 final?

问题是,你不是唯一一个接触或阅读代码的人。赋予正确的语义意义对于可读和可维护的代码至关重要。您可能知道服务和/或控制器将是单例,因此不需要将变量放在静态中,但这样您就可以显式声明它。

加法:

如果构建失败,你将如何在单例构建过程中记录一些东西:-)

我引用 @dognose 评论只是为了让答案更完整。使logger静态地址存在一个实际问题:在创建期间记录。

跟进:

我只是想知道为什么我们需要 final static Logger 而不仅仅是 final Logger。是什么证明 logger 是静态成员而不是类成员?

假设您的班级不是单身人士。在这种情况下,Logger 必须只记录。它与对象无关,它是一个类属性。这意味着如果您实例化一个或一千个对象,记录器不会改变。因此,您可以在所有对象之间共享它,从而使其成为静态的。

假设您的班级是单身人士。永远只有一个实例。静态还有用吗?从实际的角度来看,没有。您将只有一个类实例,因此只有一个记录器,无论是否静态。尽管如此,如果您将其声明为静态,则您声明您希望该记录器成为该类的属性,而不是该类的对象。您正在明确您的意图和设计,从而提高代码的质量。

希望这能回答你的问题。

【讨论】:

  • 对不起。但这并不能回答我的问题。我只是想知道为什么我们需要最终的静态 Logger 而不仅仅是最终的 Logger。是什么证明 logger 是静态成员而不是类成员?
  • 我在答案中添加了更多的 cmets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多