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

Java方法间变量共享问题:如何在onUpdate中获取RandomWorderer的列表值

解决方案

嘿,我来帮你理清这个问题!你现在遇到的核心问题是:lookingToGetGearedUp是RandomWorderer方法里的局部变量,局部变量只能在定义它的方法内部访问,所以onUpdate方法根本看不到它。结合你想保持方法分离、提高可读性的需求,我们可以通过「类成员变量+初始化方法」的方式来解决,还能顺便帮你理清Java方法/变量修饰符的作用:

第一步:把列表改成类的成员变量

首先,我们需要把lookingToGetGearedUp从方法内部移到类的作用域里,作为类的私有成员变量。这样整个类的所有方法都能访问到它:

// 把列表定义成类的私有成员变量,放在方法外面
private List<String> lookingToGetGearedUp;
private Random random = new Random(); // 新增随机实例,用来生成随机索引
private Setting<Integer> delay = register(Settings.i("Delay", 30));

第二步:修改初始化方法来填充列表

原来的RandomWorderer方法现在用来初始化这个成员变量,注意Java方法名要遵循小驼峰命名规范(首字母小写),所以我们把它改成initGearedUpMessages更规范:

// 私有初始化方法,用来填充列表,只有当前类能调用它
private void initGearedUpMessages() {
    lookingToGetGearedUp = Arrays.asList(
        "LOOKING TO GET GEARED UP?",
        "LOOKING FOR GEAR ON THE CHEAP?",
        "WANT A FAST AND RELIABLE SHOP?",
        "LOOKING FOR A SHOP WITH CHEAP PRICES",
        "HAVE YOU BEEN LOOKING FOR A SHOP WITH PAYPAL BUYER PROTECTION?",
        "WANT ITEMS FAST AND AT A CHEAP PRICE?",
        "SELLING A WIDE VARIETY OF PVP, BUILDING and RESOURCE SHULKERS",
        "\"amazing staff, quick service, will buy again! 10/10\"",
        "\"11/10 Above and beyond my expectations with excellent service, friendly deliverer and infinite patience would definitely buy again\"",
        "\"9/10 very fast delivery cheap prices and good customer service\"",
        "\"30/10 got the items within 2hours fast asf\"",
        "\"10/10 staff was very patient and delivery was pretty fast (items were also very cheap)\"",
        "UBERSHULKER - THE BEST 2B2T STORE"
    );
}

第三步:确保初始化方法被调用

你需要在类的构造方法里调用这个初始化方法,或者在onUpdate第一次执行前调用,这样列表在使用前就已经被填充了:

// 假设这是你的类构造方法,替换成你实际的类名
public YourClassName() {
    initGearedUpMessages();
}

第四步:修改onUpdate方法来使用列表

现在onUpdate里就能直接访问lookingToGetGearedUp了,注意用我们定义的random实例来生成随机索引(你之前的代码里r没有定义,这里补充完整):

public void onUpdate() {
    if (DiscordLink.equals(0)) {
        try{
            Thread.sleep(delay.getValue() * 1000); // 注意:如果delay是秒数,要转成毫秒,否则sleep时间会极短
        } catch (InterruptedException r) {
            r.printStackTrace();
        }
        // 生成随机索引,获取列表里的随机字符串
        String randomMessage = lookingToGetGearedUp.get(random.nextInt(lookingToGetGearedUp.size()));
        mc.player.sendChatMessage(">" + RandomString.getAlphaNumericString() + " " + randomMessage + " JOIN UBERSHULKER TODAY!: https://discord.gg/xjnS2e9");
    } else {
        ModuleManager.getModuleByName("AutoReply").enable();
        try {
            Thread.sleep(delay.getValue() * 1000);
        } catch (InterruptedException r) {
            r.printStackTrace();
        }
        String randomMessage = lookingToGetGearedUp.get(random.nextInt(lookingToGetGearedUp.size()));
        mc.player.sendChatMessage(">" + RandomString.getAlphaNumericString() + " " + randomMessage + " JOIN UBERSHULKER TODAY! To Recieve an Invite /msg " + mc.player.getName() + " request! and wait a moment!" );
    }
}

关于扩展性(未来添加其他列表)

如果以后要加其他列表,比如otherPromotions,你可以用同样的模式:

  1. 新增类成员变量:private List<String> otherPromotions;
  2. 新增对应的初始化方法:private void initOtherPromotions() { ... }
  3. 在构造方法里调用这个新的初始化方法
  4. 在需要的地方用random.nextInt(otherPromotions.size())获取随机内容

这样每个列表的初始化逻辑都分开,代码可读性非常好,完全符合你的需求。

补充:Java修饰符的简单说明

  • private:修饰变量/方法时,只有当前类能访问,外部类看不到,保证代码封装性
  • public:修饰方法时,外部可以调用(比如onUpdate应该是框架调用的方法,所以用public)
  • static:修饰的变量/方法属于类本身,而不是类的实例,你现在的场景不需要用static,因为每个类实例可能有自己的配置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:52:55