如何在另一个Java类中获取AddContract类内相同的随机字符串CONNUM
解决在ContractsPage中获取AddContract已生成的CONNUM问题
看起来你现在卡壳的核心点是:每次在ContractsPage里新建AddContract.Data实例时,都会重新生成一个随机的CONNUM,而不是复用AddContract类里已经初始化好的那个值——这是因为每个Data实例创建时都会调用randInt()生成新随机数,新实例的CONNUM自然和原实例不一样。
下面给你两个针对性的解决方案:
方案1:通过AddContract暴露已有的Data实例或直接返回CONNUM
最稳妥的方式是让AddContract提供公共方法,允许外部访问它已经初始化好的data实例,或者直接返回CONNUM的值,这样就不用新建Data实例,直接复用已有的那个。
首先修改AddContract类:
public class AddContract { private Data data = new Data(); // 方法1:直接返回生成好的CONNUM(推荐,不用暴露内部类细节) public String getContractNumber() { return data.CONNUM; } // 方法2:返回Data实例(如果需要使用Data里的其他方法/字段) public Data getData() { return data; } class Data { final String CONNUM = String.valueOf(randInt()); public int randInt() { int min = 1; int max = 7777; return (int) (Math.random() * max + min); } } }
然后在ContractsPage里,你需要持有一个AddContract的实例(可以通过构造方法传入、全局引用等方式获取),再调用上面的方法拿到已生成的CONNUM:
public class ContractsPage { // 持有AddContract的实例 private AddContract addContractInstance; // 通过构造方法传入AddContract实例 public ContractsPage(AddContract addContract) { this.addContractInstance = addContract; } public ContractsPage FindContractByContractNumber() { // 方式1:直接获取CONNUM String targetContractNum = addContractInstance.getContractNumber(); // 方式2:获取已有的Data实例,再取CONNUM AddContract.Data existingData = addContractInstance.getData(); String targetNumFromData = existingData.CONNUM; // 这里写你根据合同号查找的业务逻辑 // ... return this; } }
方案2:将Data改为静态内部类并复用静态CONNUM(适用于全局唯一合同号)
如果你的场景只需要一个全局唯一的CONNUM(而非每个AddContract实例对应独立的合同号),可以把Data改成静态内部类,同时把CONNUM设为静态常量:
修改AddContract:
public class AddContract { static class Data { // 静态常量,类加载时仅生成一次 public static final String CONNUM = String.valueOf(randInt()); private static int randInt() { int min = 1; int max = 7777; return (int) (Math.random() * max + min); } } }
然后在ContractsPage里直接访问:
public class ContractsPage { public ContractsPage FindContractByContractNumber() { String targetContractNum = AddContract.Data.CONNUM; // 后续业务逻辑 return this; } }
关键提醒
- 内部类权限:如果原来的
Data是私有内部类,你需要把它改成public或包私有(如果ContractsPage和AddContract在同一个包下),或者直接用方案1的getContractNumber()方法,不用暴露Data类的细节。 - 绝对不要在
ContractsPage里手动new AddContract.Data(),这必然会生成新的随机数,永远拿不到原实例的CONNUM。
内容的提问来源于stack exchange,提问作者MrDSLow
相关产品推荐
相关产品推荐

