bugfix> java > 投稿

私は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」の値は「Token」と同じにする必要があります

回答 3 件
  • Math.random()  呼び出すたびに異なる(ランダムな)値を生成します。 generateToken() のたびに同じ結果を得たい場合  (Tokenの1つのインスタンスで)が呼び出された場合、取得したランダムな値を保存する必要があります(たとえば、 generateToken() の最初の呼び出しで)  Tokenクラスのフィールド。

    同じ理由で、 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());
        }
    }
    
    

    編集:+いくつかの説明

  • オブジェクトが異なるため、同じ値を取得していません。メインのテストメソッドでオブジェクトを手動でインスタンス化しているため、 callGeneretedToken()   CallToken のメソッド  クラスは別のオブジェクトをインスタンス化しています。

    クラスCallTokenのフィールドとしてTokenを使用し、ゲッターを使用する必要があります。

    Ps. You need to change the 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());
        }
    }
    
    

  • 見てみましょうシングルトン デザインパターン。

    これを使用することで、基本的には一度作成されたオブジェクトのインスタンスを再利用しています。

    Baeldungのシングルトンパターンの説明

あなたの答え