使用当前实例 - Java

时间:2018-05-25 11:16:16

标签: java object

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

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”值应该与“Token”相同

3 个答案:

答案 0 :(得分:3)

每次调用它时,

Math.random()都会生成一个不同的(随机)值。如果你希望每次调用generateToken()时(在单个令牌实例上)都有相同的结果,你需要存储你得到的随机值(比如第一次调用generateToken()时令牌类中的字段。

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

例如:

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());
    }
}

编辑:+一些澄清

答案 1 :(得分:2)

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

你应该将Token作为CallToken类中的一个字段并且已经获取它。

  

聚苯乙烯。您也需要更改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());
    }
}

答案 2 :(得分:0)

看看 Singleton 设计模式。

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

Singleton pattern explanation on Baeldung