Использовать текущий экземпляр - Java - PullRequest
0 голосов
/ 25 мая 2018

Я новичок в Java и хотел знать, как вызывать текущий экземпляр объекта вместо создания объекта.eg-

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 голосов
/ 25 мая 2018

Вы не получаете одно и то же значение, потому что это разные объекты, вы создаете экземпляр объекта вручную в своем основном методе тестирования, а метод callGeneretedToken() в классе CallToken создает экземпляр другого объекта.

Вы должны иметь токен в качестве поля в классе CallToken и иметь геттер для него.

Ps.Вам также нужно изменить класс 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());
    }
}
0 голосов
/ 25 мая 2018

Взгляните на Singleton шаблон проектирования.

Используя его, вы в основном повторно используете экземпляр объекта, который был создан один раз.

Singleton patternобъяснение Baeldung

0 голосов
/ 25 мая 2018

Math.random() производит различное (случайное) значение каждый раз, когда вы вызываете его.Если вы хотите получать один и тот же результат каждый раз, когда вызывается generateToken() (для одного экземпляра токена), вам нужно сохранить полученное случайное значение (скажем, при первом вызове generateToken() в поле в токене).class.

По той же причине вам также нужно вызвать 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());
    }
}

РЕДАКТИРОВАТЬ: + некоторые уточнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...