Java-从非静态变量分配的私有静态字段

问题描述 投票:0回答:1

以下是示例类

public class Utils {
    private static Function<String,Type2> typeFunc = null;

    public static void setTypeFunction(Function<String,Type2> func) {
    Utils.typeFunc = func;
    }

    public static Type2 getTypeFuncResult(String input) {
       return Utils.typeFunc.apply(input);
    }

}

然后是调用类

// Other code
String input = dummy;

// Setup func
Function<String,Type2> testFunc = s->new Type2(s);

// Call - it's all good
Utils.setTypeFunction(testFunc);
Utils.getTypeFuncResult(input);

// Nullify the func lambda output
testFunc = s->null;

// Now call again
Utils.getTypeFuncResult(input);  // Expected NULL, but still gets a Type2 object

我试图在以下情况下理解这一点:

a)对于testFunc的引用更改对于静态Utils.typeFunc不可见-这意味着内存可能在我不知情的情况下被浪费了。

b)参照静态引用对Lambda进行不同的评估。

c)其他。

我相信这是更基本的Java,但是想知道我是否可以得到任何指针。

java reference static
1个回答
0
投票

[不确定您为什么期望第二次调用Utils.getTypeFuncResult(input)来更改其输出。毕竟,您从未用Utils.setTypeFunction(testFunc)调用过testFunc = s->null-因此,Utils.typeFunc仍然等于s->new Type2(s)

您尚未提供有关Type2的信息,但是如果Type2(null)是有效的构造函数调用,则返回值是该调用的结果Type2对象是有意义的。

[诚然,我来自python背景,在这种情况下,以任何容量分配变量意味着分配新的内存并指向其他内容,即使该变量已经存在(名称是引用,并更改关联的引用带有名称的名称不会更改该引用先前与之相关的任何其他名称)-而且我不知道Java如何在后台进行操作。但是,看起来[[something正在复制somewhere,因此,当您更改testFunc的值时,Utils.typeFunctestFunc不会以一种或另一种方式指向同一对象。

© www.soinside.com 2019 - 2024. All rights reserved.