Java新手求教:如何调用对象当前实例而非新建实例以获取相同结果
解决Java中复用对象实例而非新建实例的问题
嘿,作为Java新手,你遇到的问题核心是CallToken类每次调用方法时都会新建一个Token实例,所以生成的随机数和TestToken里的那个Token实例完全无关。要让两者结果一致,我们需要让CallToken复用已经创建好的Token实例,而不是每次都new一个新的。下面给你几种常见的实现方式:
方法1:通过构造方法传入Token实例
我们可以在创建CallToken对象的时候,把已经存在的Token实例传递给它,这样CallToken就能一直用这个实例了:
class Token { public double generateToken() { return Math.random(); } } class CallToken { // 保存外部传入的Token实例 private Token token; // 构造方法,接收Token实例 public CallToken(Token token) { this.token = token; } public double callGeneratedToken(){ // 直接用传入的实例,不再新建 return token.generateToken(); } } public class TestToken { public static void main(String[] args) { Token token = new Token(); // 先调用一次,得到随机数 double firstToken = token.generateToken(); System.out.println(firstToken); // 创建CallToken时传入已有的token实例 CallToken callToken = new CallToken(token); // 调用方法,用同一个Token实例生成,结果和上面一致 System.out.println(callToken.callGeneratedToken()); } }
方法2:通过Setter方法注入Token实例
如果不想在构造的时候就传入,也可以用Setter方法来设置Token实例:
class Token { public double generateToken() { return Math.random(); } } class CallToken { private Token token; // Setter方法,用于设置Token实例 public void setToken(Token token) { this.token = token; } public double callGeneratedToken(){ return token.generateToken(); } } public class TestToken { public static void main(String[] args) { Token token = new Token(); double firstToken = token.generateToken(); System.out.println(firstToken); CallToken callToken = new CallToken(); // 调用Setter传入已有的token实例 callToken.setToken(token); System.out.println(callToken.callGeneratedToken()); } }
方法3:把Token实例作为方法参数传递
如果只是偶尔需要复用某个实例,也可以直接把Token作为参数传给callGeneratedToken方法:
class Token { public double generateToken() { return Math.random(); } } class CallToken { public double callGeneratedToken(Token token){ return token.generateToken(); } } public class TestToken { public static void main(String[] args) { Token token = new Token(); double firstToken = token.generateToken(); System.out.println(firstToken); CallToken callToken = new CallToken(); // 调用方法时传入已有的token实例 System.out.println(callToken.callGeneratedToken(token)); } }
额外补充:如果想让同一个Token实例返回固定值
上面的方法只是让CallToken复用同一个Token实例,但每次调用generateToken还是会生成新的随机数。如果你希望同一个Token实例每次返回相同的随机数,可以把生成的值存在Token类里:
class Token { private final double tokenValue; // 创建实例时就生成随机数并保存 public Token() { this.tokenValue = Math.random(); } public double generateToken() { return tokenValue; } }
这样不管调用多少次同一个Token实例的generateToken,都会返回同一个值,此时CallToken复用这个实例的话,输出结果就会完全一致了。
内容的提问来源于stack exchange,提问作者Gulshan Nayak
相关产品推荐
相关产品推荐

