为什么java中没有变量的重置选项

为什么java中没有变量的重置选项,java,initialization,language-features,primitive-types,Java,Initialization,Language Features,Primitive Types,有时当我们声明并初始化一个变量时,比如说我们有一个inti=10然后在一些代码之后,这个变量会像下面的代码一样被修改 public class reset { public static void main(String[] args) { // TODO Auto-generated method stub int i = 10; int co = 1; while (co < 10) { i

有时当我们声明并初始化一个变量时,比如说我们有一个
inti=10然后在一些代码之后,这个变量会像下面的代码一样被修改

public class reset {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int i = 10;
        int co = 1;
        while (co < 10) {
            i++;
            System.out.println(i + "*" + co + "=" + i * co);
            if (i == 99) {
                i = 11; //line 11
                co++;
            }
        }
    }
}
我认为这对生产力很有好处,不是吗

我们需要重新初始化那个变量,若我们有任何语言特性来自动执行它,不是很好吗

没有

我认为这对生产力很有好处,不是吗

没有

在许多情况下,将变量重置为其起始值是变量范围过大的标志。因此,使用干净的代码,您几乎不需要这样的特性

当然,每一个特性都是以使语言更加复杂为代价的。

初始化行

int i = 10;
只需创建字节码指令,将值10分配给变量。该任务与任何其他任务没有区别

要实现重置,需要为每个变量保留额外的元数据位,以说明特殊的初始值是什么。。该元数据当前未保存在符号表中,因为Java中没有“初始值”的概念。额外的开销将与reset命令的实用性相权衡


这可能是个好主意,但您也可以通过声明一个常量并重新分配给该常量来获得相同的结果。

这段代码怎么样?我可以从初学者的角度理解您的问题,但通常需要更多的实践来了解为什么不需要某些构造:

public class NoReset {
    private static final int X_START = 11;
    private static final int X_END = 99;
    private static final int Y_START = 1;
    private static final int Y_END = 9;

    public static void main(String[] args) {
        for (int y = Y_START; y <= Y_END; y++) {
            for (int x = X_START; x <= X_END; x++) {
                final int result = x * y;
                System.out.printf("%d * %d = %d%n", x, y, result);
            }
        }
    }
}
公共类NoReset{
专用静态最终整数X_开始=11;
专用静态最终整数X_END=99;
专用静态最终整数Y_开始=1;
专用静态最终int Y_END=9;
公共静态void main(字符串[]args){

对于(int y=y_START;y如果您想使用当前的Java语言来做您想做的事情,那么只需在每个类中提供一个函数来执行“重置”,如:


如果它被初始化为一个有副作用的表达式呢?您建议的语法类似于标签,这会让人困惑。我只会为初始值分配一个常量,并在您重置它时分配该常量。SLaks:假设此重置仅在分配常量值时才可能abor:在组中工作时,更容易忘记由另一个开发人员指定的特定值不是一个好主意,但是实现
init()
方法来重置可变类的字段可能是一个好主意,这取决于类的使用方式。您的答案不是很枯燥。+1用于提及“范围”创建一个常量并每次赋值的想法从我的脑海中消失了,但说到开销,为什么不回到第一次赋值字节码指令,然后再赋值一次,不需要额外的数据?我明白了吗?你不想随意复制字节码。你不想随意重用变量r、 如果你不得不在两页代码中查找初始值,而不是仅仅看到赋值(希望是可读的常量标识符),那么它的可读性就不是很好。如果可以在某些赋值(常量值)中这样做的话,它将打破对称性不适用于有副作用的赋值。不太有用,有很多原因说明这不是一个好主意,对不起。@initParam-是的,如果Java语言有“默认”值的概念,那么您可以发明一个“reset”语句,跟踪符号表中的默认值,并生成适当的字节码来分配符号表中的默认值重置语句的位置。然而,我越来越不相信它的实用性。我想不出在我的代码中有哪种情况下“重置”会是代码的任何特定简化。
public class NoReset {
    private static final int X_START = 11;
    private static final int X_END = 99;
    private static final int Y_START = 1;
    private static final int Y_END = 9;

    public static void main(String[] args) {
        for (int y = Y_START; y <= Y_END; y++) {
            for (int x = X_START; x <= X_END; x++) {
                final int result = x * y;
                System.out.printf("%d * %d = %d%n", x, y, result);
            }
        }
    }
}
private void reset() {
    var = xxx;
    var2 = yyy;
    ...
}