我是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());
}
}
看看单例设计模式。
通过使用这个,你基本上是在重用曾经创建过的对象实例。
关于贝尔东的单例模式解释