繁体   English   中英

创建一个随机值以在所有类之间共享Java

[英]Create a Single Random Value to Share Across Classes Java

Final(?)编辑:Leonardo Pina的解决方案看起来像我需要的。 谢谢大家的意见! 我的代码现在是:

public final class Roll {
    private static final Random r1 = new Random();
    private final int r = level();

    private static final int level() {
        int s = 1, e = 100;
        int r = r1.nextInt((e - s) + 1) + s;
        return r;
    }

    public int itemType() {
        boolean b = r1.nextBoolean();
        int a = ((b) ? 1 : 2);
        return a;
    }

    public int getR() {
        return r;
    }

}

以及在另一类中的实现:

public class Damage {
    Roll r;

    Damage(Roll r) {
        this.r = r;
    }

    public int damageOut() {
        int a = r.getR();   //roll value
        return a * 2;   //test math on r
    }
}

编辑:谢谢您的答复。 但是,似乎我对这种方法的使用尚不清楚。 道歉! 这就是我需要的:

调用Roll类,例如获得“ 12”
OtherClass1通过getter从Roll获得“ 12”
OtherClass2 通过getter从Roll获得“ 12”
再次调用Roll类,获取一个新的随机数,例如“ 48”
OtherClass1通过getter从Roll获得“ 48”
OtherClass2 通过吸气剂从Roll获得“ 48”

使用提供的解决方案,Roll会创建一个随机数,而不会再创建一个新的随机数。 我需要Roll来按需创建随机数,然后与其他类共享该随机数。 我不希望它只生成一个数字然后停止。 我希望这是有道理的。 谢谢您到目前为止的答复!


我已经搜索并阅读了类似主题的其他主题(包括主题,这是我尝试解决问题的方式),但是尝试的方法均失败了。 我需要创建一个随机值,然后在多个类中使用相同的值。

我的随机课程:

public final class Roll {
    private static final Random r1 = new Random();
    private final int r = level();

    private static final int level() {
        int s = 1, e = 100;
        int r = r1.nextInt((e - s) + 1) + s;
        return r;
    }

    public int itemType() {
        boolean b = r1.nextBoolean();
        int a = ((b) ? 1 : 2);
        return a;
    }

    public int getR() {
        return r;
    }

}

还有一个我从随机类中调用静态值的类:

public class OtherClass{
    Roll roll = new Roll();
    int r = roll.getR();

    public int getR() {
        return r;
    }
}

当我从OtherClass调用getter时,该值不同于Roll的getter。 我希望它们具有相同的价值。

我将测试的值称为:

Roll roll = new Roll();
int r = roll.getR();
OtherClass other = new OtherClass();
int o = other.getR();

任何指导将不胜感激。 祝你有美好的一天。

也许最简单的方法,使工作将是场rRoll为静态,使Roll类看起来是这样的:

ublic final class Roll {
private static final Random r1 = new Random();
private static final int r = level();

private static final int level() {
    int s = 1, e = 100;
    int r = r1.nextInt((e - s) + 1) + s;
    return r;
}

public int itemType() {
    boolean b = r1.nextBoolean();
    int a = ((b) ? 1 : 2);
    return a;
}

public int getR() {
    return r;
}

}

或者第二种方法是使Roll类成为单例。

编辑:由于您已经更改了问题的意图,并且据我了解,您应该研究观察者设计模式。 这可能对您的情况有所帮助。

当您创建OtherClass的新实例时,您还将创建Roll的新实例,因此,这些纸卷是不同的。

您需要确保从同一对象Roll获取值R。

这可以通过对Roll类使用单例模式来实现,或者可以指定要用于获取值的Roll对象,这样,您可以针对不同的目的进行多个滚动。


编辑:回答您的编辑:要获得新数字,每当生成新值时,都应更新Roll类中的r值,例如,level()方法可以返回r变量,而不是返回值:

public final class Roll {
    private static final Random r1 = new Random();
    // We now attribute a value to r uppon construction
    private final int r;
    public Roll() {
        level();
    }

    // Whenever level() is called the value of r is updated
    private static final int level() {
        int s = 1, e = 100;
        int r = r1.nextInt((e - s) + 1) + s;
        this.r = r;
    }

    public int itemType() {
        boolean b = r1.nextBoolean();
        int a = ((b) ? 1 : 2);
        return a;
    }

    public int getR() {
        return r;
    }

}

class Game {

    public static void main(String[] args) {
        // Create the Roll obj
        Roll myRoll = new Roll();
        // Initialize the other objs with myRoll
        Board board = new Board(myRoll);
        Player player = new Player(myRoll);
        // Do your comparison
        int b = board.getRoll();
        int p = player.getRoll();
        // EDIT: get a new value
        myRoll.level();
        // Do your comparison once more
        b = board.getRoll();
        p = player.getRoll();

    }

    class Board {
        Roll r;
        Board(Roll roll) {
            this.r = roll;
        }
        public int getRoll() {
            return r.getR();
        }
    }

    class Player {
        Roll r;
        Player(Roll roll) {
            this.r = roll;
        }
        public int getRoll() {
            return r.getR();
        }
    }
}

正如有人在评论中说的那样,您应该遵循单例设计模式,这意味着变量r在所有Roll类实例中应该是唯一的。 为此,您的代码必须看起来像这样:

public class RandomTest {

    public static void main(String[] args) {
        Roll roll = new Roll();
        int r = roll.getR();

        OtherClass other = new OtherClass();
        int o = other.getR();
    }

}

class Roll {
    private static Random r1 = new Random();
    private static int r = level();

    private static final int level() {
        int s = 1, e = 100;
        int r = r1.nextInt((e - s) + 1) + s;
        return r;
    }

    public int itemType() {
        boolean b = r1.nextBoolean();
        int a = ((b) ? 1 : 2);
        return a;
    }

    public int getR() {
        return r;
    }
}

class OtherClass{
    Roll roll = new Roll();
    int r = roll.getR();

    public int getR() {
        return r;
    }
}

共享Roll实例如何?

Roll roll = new Roll();
// roll.roll(); // Unclear how you "refresh" the data

int r = roll.getR();
OtherClass other = new OtherClass(roll);
int o = other.getR();

assert(o == r);

class OtherClass {
    private final Roll roll;

    public OtherClass(Roll roll) {
        this.roll = roll;
    }

    public int getR() {
        return roll.getR();
    }
}

提示:我认为带有roll()方法的Dice类更有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM