4

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

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

4

1 回答 1

9

我想同样的问题也可以问到finals:“如果我知道我不会通过代码来触及它,为什么还要声明一个变量为final?

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

添加:

如果构建失败,您将如何在构建单身人士的过程中记录一些东西:-)

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

跟进:

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

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

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

希望这能回答你的问题。

于 2018-11-19T08:46:15.933 回答