最终(?)编辑: 莱昂纳多皮纳的解决方案看起来像我需要的。谢谢大家的意见!我的代码现在是:
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 也从Roll通过getter接收“12”
再次调用Roll类,获取 new 随机数,例如“48”
OtherClass1通过getter从Roll接收“48”
OtherClass2 也从Roll通过getter接收“48”
使用提供的解决方案,Roll会创建一个随机数,而不会再创建一个新的随机数。我需要Roll按需创建随机数,然后与其他类共享该随机数。我不希望它只生成一个数字然后停止。我希望这是有道理的。感谢您到目前为止的回复!
我已经搜索并阅读了类似主题的其他主题(包括this one,这是我尝试解决问题的方法),但我尝试过的方法都失败了。我需要创建一个随机值,然后在多个类中使用相同的值。
我的随机课程:
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();
非常感谢任何指导。祝你有个美好的一天。
答案 0 :(得分:1)
使其工作的最简单方法可能是将类transform-origin: top left;
中的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;
}
类设为单身。
编辑: 既然你已经改变了问题的意图,并且从我的理解中你应该看看Observer设计模式。它可能对您的情况有所帮助。
答案 1 :(得分:1)
当您创建 OtherClass 的新实例时,您还会创建滚动的新实例,因此滚动不同。
您需要确保从同一个对象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();
}
}
}
答案 2 :(得分:0)
正如有人在评论中所说,您应该遵循单例设计模式,这意味着您的变量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;
}
}
答案 3 :(得分:0)
如何共享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();
}
}
提示:我认为使用Dice
方法的roll()
类更有意义。