创建单个随机值以跨类共享Java

时间:2017-05-24 17:07:02

标签: java

最终(?)编辑: 莱昂纳多皮纳的解决方案看起来像我需要的。谢谢大家的意见!我的代码现在是:

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();

非常感谢任何指导。祝你有个美好的一天。

4 个答案:

答案 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()类更有意义。