You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java从其他类修改ArrayList不生效,第三方类访问列表判断始终为false

问题根因

  • 你在每个需要用到ClassOne的类里都重新创建了独立的ClassOne实例,不同实例的shielded列表是互不共享的:你在ClassTwo里修改的是ClassTwo实例化的那个vars对象的列表,Class3里访问的是另一个新实例的空列表,自然永远返回false。
  • 另外你贴出的ClassTwo代码片段存在语法错误:ClassOne类中并没有定义global字段,vars.global.shielded的写法会直接编译报错。

解决方案

方案1:使用单例模式保证全局只有一个ClassOne实例

修改ClassOne代码,禁止外部随意创建实例,统一用静态方法获取全局唯一实例:

public class ClassOne {
    // 全局唯一实例
    private static final ClassOne INSTANCE = new ClassOne();
    public ArrayList<String> shielded = new ArrayList<>();
    
    // 私有构造方法,禁止外部new
    private ClassOne() {}
    
    // 对外提供获取实例的方法
    public static ClassOne getInstance() {
        return INSTANCE;
    }
    
    public void addItem(String item) {
        this.shielded.add(item);
    }
    
    public void removeItem(String item) {
        this.shielded.remove(item);
    }
}

所有类使用时都通过ClassOne.getInstance()获取同一个实例:

  • ClassTwo修改后写法:
ClassOne vars = ClassOne.getInstance();
// 去掉多余的.global字段
if(vars.shielded.contains(p.getUniqueId().toString())) {
    vars.removeItem(p.getUniqueId().toString());
    p.sendMessage("You are NOT in the list");
}
else {
    vars.addItem(p.getUniqueId().toString());
    p.sendMessage("You're in the list.");
}
  • Class3修改后写法:
if (ClassOne.getInstance().shielded.contains(otherPlayer.getUniqueId().toString())) {
    // 你的业务逻辑
}

方案2:将shielded列表设置为静态属性

如果不需要ClassOne有多个实例,也可以直接把列表改成静态的,属于类本身而非某个实例:

public class ClassOne {
    // 静态属性,全局共享
    public static ArrayList<String> shielded = new ArrayList<>();
    
    public static void addItem(String item) {
        shielded.add(item);
    }
    
    public static void removeItem(String item) {
        shielded.remove(item);
    }
}

使用时直接通过类名访问即可:

// ClassTwo里判断
if(ClassOne.shielded.contains(p.getUniqueId().toString())) {
    ClassOne.removeItem(p.getUniqueId().toString());
    p.sendMessage("You are NOT in the list");
}

// Class3里判断
if (ClassOne.shielded.contains(otherPlayer.getUniqueId().toString())) {
    // 业务逻辑
}

注意事项

  • 如果你的代码是多线程运行(比如服务器插件场景),需要给列表操作加同步锁,或者直接用Collections.synchronizedList包裹ArrayList,避免并发操作导致的异常。
  • 注意UUID转字符串的格式统一,避免出现大小写、分隔符不一致导致的匹配失败。

内容的提问来源于stack exchange,提问作者fizz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:15:03