[英]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();
任何指导将不胜感激。 祝你有美好的一天。
也许最简单的方法,使工作将是场r
类Roll
为静态,使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.