gpt4 book ai didi

java - 创建一个不可变的类

转载 作者:太空宇宙 更新时间:2023-11-04 08:29:38 25 4
gpt4 key购买 nike

我正在尝试创建一个代表自然数的不可变类。我使用递归来处理增量和减量方法。由于这些字段是最终字段,因此我创建了一个私有(private)构造函数,以便在递减/递增时为必要的字段分配新值。测试此实现后,我似乎无法查明问题所在。如果我递减 100,它将是 10。如果我递增 99,它将是 9。如果我递增/递减一个不在界限上的数字,我会得到一长串乱码。我想我需要朝正确的方向插入。如果它是可变的,我就能让它正常工作,因为我不必担心最终字段。

public final class SlowBigNatural implements BigNatural{
final private int natural[];
final private int nSize;
final private int HIGHEST = 9;

public SlowBigNatural() {
this.nSize = 1;
this.natural = new int[1];
this.natural[0] = 0;
}

public SlowBigNatural(int p) {
this(Integer.toString(p));
}

public SlowBigNatural(String s) {
this.nSize = s.length();
this.natural = new int[nSize];
for (int i = 0; i < nSize; i++) {
this.natural[i] = Character.digit(s.charAt(i), 10);
}
}

public SlowBigNatural(BigNatural c) {
this(c.toString());
}

private SlowBigNatural(int[] natural, int nSize){
this.nSize = nSize - 1;
this.natural = new int[this.nSize];
for (int i = 0; i < this.nSize; i++) {
this.natural[i] = natural[i];
}
}

public BigNatural increment() {
int[] nClone = new int[nSize];
System.arraycopy(natural, 0, nClone, 0, nSize);
if (nSize == 1 || nClone[nSize - 1] != HIGHEST) {
nClone[nSize - 1]++;
BigNatural nInc = new SlowBigNatural(nClone.toString());
return nInc;
}

else {
nClone[nSize - 1] = 0;
BigNatural temp = new SlowBigNatural(nClone, nSize);
temp.increment();
return temp;
}
}

public BigNatural decrement() {
int[] nClone = natural.clone();
if (nClone[nSize - 1] != 0) {
nClone[nSize - 1]--;
BigNatural nDec = new SlowBigNatural(nClone.toString());
return nDec;
}
else {
if (nSize != 1) {
nClone[nSize - 1] = HIGHEST;
BigNatural temp = new SlowBigNatural(nClone, nSize);
temp.decrement();
return temp;
}
else{
BigNatural nDec = new SlowBigNatural(0);
return nDec;
}
}
}

public String toString() {
String nString = "";
for (int i = 0; i < nSize; i++) {
nString += String.valueOf(natural[i]);
}
return nString.replaceFirst("^0+(?!$)", "");
}
}

我单步执行了代码,当我将数组转换为字符串并将其传递给构造函数时,似乎发生了错误。它把数组变成了一堆疯狂的东西。继续调查。

最佳答案

还没有完全研究它,但如果SlowBigNatural确实是正确的不可变的,那么如下:

BigNatural temp = new SlowBigNatural(nClone, nSize);
temp.increment();
return temp;

据我所知不太可能有用。上面对 temp.increment() 的调用创建了一个您忽略的新对象,看到您返回 temp 本身,而不是 temp.increment() 的结果。

您可以尝试将上面的内容更改为:

BigNatural temp = new SlowBigNatural(nClone, nSize);
return temp.increment();

如果有效,请对 decrement() 执行相同的操作。

关于java - 创建一个不可变的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7788011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com