使用当前实例 - Java

  • 本文关键字:Java 实例 java object
  • 更新时间 :
  • 英文 :


我是Java的新手,想知道如何调用对象的当前实例而不是创建对象。 例如-

class Token {
public double generateToken() {
return Math.random();
}
}
class CallToken {
public double callGeneretedToken(){
Token token= new Token();
return token.generateToken();
}
}
public class TestToken {
public static void main((String[] args) { 
Token token = new Token();
System.out.println(token .generateToken());
CallToken callToken=new CallToken();
System.out.println(callToken.callGeneretedToken());
}
}

O/P-

0.4404705200846246

0.05306690188022356

问题是我希望"CallToken"值应该与"令牌"相同

每次调用Math.random()时都会生成不同的(随机(值。如果您希望每次调用generateToken()时(在 Token 的单个实例上(都获得相同的结果,则需要将获得的随机值(例如在 Token 类的字段中首次调用generateToken()时(。

出于同样的原因,您还需要在同一个Token实例上调用generateToken()。为此,您需要使用CallToken类存储对Token实例的引用,而不是每次都创建它。

例如:

class Token {
private Double value = null; 
public double generateToken() {
if (value == null) {
// value is null first time we call this. We generate our random value and store it in the field.
value = Math.random();
}
// Every time we call this, we return the same value
return value;
}
}
class CallToken {
private Token token;
// CallToken needs to know what token to call- we need to supply it with a reference.
public CallToken(Token token) {             
this.token = token;
} 
public double callGeneretedToken(){            
return token.generateToken();
}
}
public class TestToken {
public static void main((String[] args) { 
// We first create the Token, then call it, then pass the reference to it to CallToken, so it can call it too, in callGeneretedToken() 
Token token = new Token();
System.out.println(token.generateToken());
CallToken callToken=new CallToken(token);
System.out.println(callToken.callGeneretedToken());
}
}

编辑: + 一些澄清

您不会获得相同的值,因为是不同的对象,您在主测试方法中手动实例化一个对象,而CallToken类中的callGeneretedToken()方法正在实例化另一个对象。

你应该将 Token 作为类 CallToken 中的一个字段,并拥有它的 getter。

附言。您还需要更改Token类,以便仅在不存在时才生成令牌,否则当您手动调用generateToken时,Math.random()将生成一个新令牌。

请参阅示例:

class Token {
private double myGeneratedToken;
public double generateToken() {
if(myGeneratedToken == null){
myGeneratedToken = Math.random();
}
return myGeneratedToken;
}
}
class CallToken {
private Token myToken;
public double callGeneretedToken(){
return myToken.generateToken();
}
public Token getToken(){
return myToken;
}
public void setToken(Token pToken){
myToken = pToken;
}    
}
public class TestToken {
public static void main((String[] args) { 
CallToken callToken = new CallToken();
Token token = new Token();
callToken.setToken(token);
System.out.println(token.generateToken());
System.out.println(callToken.callGeneretedToken());
}
}

看看单例设计模式。

通过使用这个,你基本上是在重用曾经创建过的对象实例。

关于贝尔东的单例模式解释

最新更新