gpt4 book ai didi

java - 私有(private) Java 类属性在方法调用之间神秘地重置

转载 作者:行者123 更新时间:2023-12-01 05:56:19 24 4
gpt4 key购买 nike

我有一个非常奇怪的问题。

类属性在方法调用之间神秘地重置。

执行以下代码,因此调用构造函数,然后调用 parseConfiguration 方法。最后调用processData。

parseConfiguration 方法将“recursive”属性设置为“true”。然而,一旦进入“processData”,“recursive”就变成“false”。

这个问题并不是孤立于某个类——我的代码中有几个这样的例子。

这怎么可能发生?我尝试过在任何方法之外声明属性时初始化它们,我尝试过在构造函数中初始化它们......没有任何效果。

我在这里能想到的唯一复杂之处是这个类是由一个在线程中运行的对象调用的——但这里每个线程都有一个实例,所以线程肯定不会干扰。我尝试将两种方法设置为“同步”,但这种情况仍然发生。

我在 Linux 上使用 JDK 1.6.0_19。

请帮忙!

/**
* This class or its superclasses are NOT threaded and don't extend Thread
*/
public class DirectoryAcquirer extends Manipulator
{
/**
* @var Whether to recursively scan directories
*/
private boolean recursive = false;

/**
* Constructor
*/
public DirectoryAcquirer()
{
}

/**
* Constructor that initialises the configuration
*
* @param config
* @throws InvalidConfigurationException
*/
public DirectoryAcquirer(HierarchicalConfiguration config) throws InvalidConfigurationException
{
super(config);
}

@Override
protected void parseConfiguration() throws InvalidConfigurationException
{
// set whether to recurse into directories or not
if (this.config.containsKey("recursive"))
{
// this.recursive gets set to "true" here
this.recursive = this.config.getBoolean("recursive");

}
}

@Override
public EntityCollection processData(EntityCollection data)
{
// here this.recursive is "false"
this.logger.debug("processData: Entered method");
}
}

最佳答案

同步方法只是意味着两个线程不能同时处于同步方法内。它对于竞争条件很有用,但它并不是意外事件发生的唯一方式。

线路

// this.recursive gets set to "true" here
this.recursive = this.config.getBoolean("recursive");

让我困惑。你怎么知道 this.config.getBoolean("recursive") 返回 true ?它仅获取与键递归存储的 boolean 值。该值可能为真,但也可能为假。

假设您验证 this.config.getBoolean("recursive") 确实返回 true,那么您必须查看代码之外的内容。确实有什么东西调用了 protected void parseConfiguration() 吗?如果不是,那么 this.recursive 将永远不会被设置超出其初始声明。

假设调用了 protected void parseConfiguration(),并且它正确地将 this.recursive 设置为 true。然后,您需要搜索类的其余部分(只有此类,因为 this.recursive 是私有(private)的,并查看是否有任何其他代码可能会重置该值。

其他可能性是您在两次调用 protected void parseConfiguration() 之间处理的不是同一个对象。有时,当您使用对象映射或其他形式的对象缓存时,会发生这种情况,如果对象使用或写入错误,则有机会切换对象。您可能想要添加一些日志记录,它将打印出对象的 id (toString()) 以及 this.recursive 的值。

关于java - 私有(private) Java 类属性在方法调用之间神秘地重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2834824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com