【问题标题】:understanding a final static use on a map field of a class了解类的地图字段上的最终静态使用
【发布时间】:2023-09-17 07:37:01
【问题描述】:

我是一名 c++ 开发人员,正在努力熟悉核心 Java 概念。 我发现这令人困惑,因为我的最终静态是在构造对象后无法更改的东西。 (如果我错了,请纠正我)

我遇到了下面的实现,我觉得很困惑,因为它似乎允许将值添加到 Map 中,即使它是最终静态的

public class MockUserServiceImpl implements UserService {

    private static final Map<String, User> userMap = new HashMap<String, User>();

    public static void addUserToCache(int userId, String userName) {
        if (!userMap.containsKey(userName)) {
            userMap.put(userName, new User(userId, userName));
        }
    } 
}

有人能解释一下这里的静态final到底是什么意思

【问题讨论】:

  • 好吧,解释一下为什么盲目地说没用更有意义。即使这是一个愚蠢的问题,我也想在这里理解。
  • 您是否尝试过查找?
  • 是的:)。实际上,这让我感到困惑。用户如何可以选择将信息添加到地图中。相反,如果它只是静态的,那将是有意义的。尝试看看是否也可以提供任何在线参考。

标签: java encapsulation final static-members


【解决方案1】:

不要将Map 视为一种数据结构。将其视为具有方法的任何其他类,例如put(..)。你是说如果你有

public class Foo {
    public void bar() {}
}

你不应该打电话给bar()

final Foo foo = new Foo();

仅仅因为它是final?那有什么用呢?

final 关键字仅防止变量被重新分配,而不是可以调用哪些方法或可以访问哪些字段。 It has a different meaning when used on on methods and classes.

至于static,请阅读:

What does the 'static' keyword do in a class?

【讨论】:

    【解决方案2】:

    java 中的所有对象都是引用。 final 关键字意味着引用是最终的,但对象本身可以是可变的。看Java's final vs. C++'s const

    静态关键字意味着所有对象只共享一个实例。

    【讨论】:

      【解决方案3】:

      static 在 Java 中通常表示静态上下文,对应于类。在这种情况下,静态字段可以看作是一个类的字段。静态字段也可以看作是全局变量。

      final 与 C++ 中的const 非常相似,表示引用或值不能重新赋值。

      当它们一起使用时,它们表示具有全局可见性的常量引用或值。

      您可能还想阅读JLS §8.3.1 Field Modifiers

      【讨论】:

      • 是的,我发现解释试图与 C++ 中的 const 指针进行类比,我们无法更改指针指向的内容。
      最近更新 更多