Java从另一个类和依赖值更改变量

时间:2014-06-09 19:01:30

标签: java

我的类变量有问题,因为总是^^ 所以我正在构建一个名为Prng的类,其变量为

private int randListSize = 10; 
private byte randList[] = new byte[randListSize]; 
private byte[] seed = new byte[]{ 34, -70, -4, 117, 98 }; 

相关的getters / setters 和方法

public void prng() {
        SecureRandom random;
        try {
            random = SecureRandom.getInstance("SHA1PRNG"); 
            random.setSeed(seed);
            random.nextBytes(randList); 
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

在另一个名为Test.java的类中,我想: 1)将randListSize设置为/我想要的随机字节数 2)具有此大小的randList,而不是原始的10大小

每当我尝试时,我的randList总是大小为10.你能帮我吗? 在我班上测试我写过:

Prng prng = new Prng();
System.out.println(prng.getRandListSize() + " " + prng.getRandList().length);
prng.setRandListSize(11);
System.out.println(prng.getRandListSize()+ " " + prng.getRandList().length);

返回“10 10; 11 10”,最后我想要“11 11”。

编辑:这是我的getter / setters:

public int getRandListSize() {
    return randListSize;
}

public void setRandListSize(int randListSize) {
    this.randListSize = randListSize;
}

public byte[] getSeed() {
    return seed;
}

public void setSeed(byte[] seed) {
    this.seed = seed;
}

public byte[] getRandList() {
    return randList;
}

public void setRandList(byte[] randList) {
    this.randList = randList;
}

2 个答案:

答案 0 :(得分:2)

首先,在我看来,randListSize是一个无用的字段,因为该属性可以直接从数组中检索,并且由于操作不昂贵,因此不需要缓存该值。因此,您实际上也不需要该字段的getter / setter。我看到你正在使用它作为初始大小变量,但在这种情况下,我认为它更好地成为构造函数/工厂方法的参数,因为它实际上不需要在其他任何地方使用

其次,setRandListSize()实际上并没有改变randList的大小,因为数组一旦创建,就无法进行结构修改(即创建数组后不能使数组更长/更短)。您只是更改了一个不相关的变量,这会在randListSize停止匹配randList.length后导致一些混淆。这就是您看到11 10而不是11 11的原因 - randListSize仅在数组创建时使用,后来对randListSize的更改不会影响数组。

为了得到你想要的结果,你将不得不分配一个全新的数组,并设置randList指向它而不是旧的数组,你可以使用你的{{1 }} 方法。或者,您可以编写一个方法,可能称为setRandList(),以便一次完成所有工作。

答案 1 :(得分:0)

您的setRandListSize方法需要重新创建randList数组。如果您需要将数据保存在其中,您的方法应该复制适合新数组的任何数据。

public void setRandListSize(int randListSize) {
    this.randListSize = randListSize;
    this.randList = new byte[randListSize];
}