2014-09-21 67 views
-1

有时,当我们声明和初始化变量,假设我们有一个int i =10;再经过一些代码,这个变量将被修改这样的代码波纹管为什么在java中有变量

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++; 
      } 
     } 
    } 
} 

然后在某个不重置选项点(这里在第11行),我们需要重新初始化,然后变量,那岂不是很好,如果我们有任何的语言功能可以自动做这件事,而不是例如

reset:i 

我认为这是对生产力非常有利,不是吗是吗?

+6

如果有什么是初始化为带有副作用的表达式? – SLaks 2014-09-21 16:21:51

+0

您提出的语法与标签类似,这会造成混淆。我只需为初始值分配一个常量,并在重置时指定该常数。 – 2014-09-21 16:22:56

+0

SLaks:假设这种重置只有在分配常量值时才可能使用 – 2014-09-21 16:25:22

回答

4

我们需要重新初始化,然后变量,那岂不是很好,如果我们有任何的语言特性做自动代替?

没有

我认为这是对生产力是非常有益的,不是吗?

没有

重置为初始值的变量是在很多情况下,一个标志,该变量的范围大。所以干净的代码几乎不需要这样的功能。

当然,每个功能都是以使语言复杂化为代价的。

+2

你的答案不是很干。 – SLaks 2014-09-21 16:25:15

+0

为什么不能? Jens – 2014-09-21 16:26:56

+0

+1提到“范围” – 2014-09-21 17:58:53

2

的初始化线

int i = 10; 

简单地创建字节代码指令值10分配给变量。该任务与任何其他任务相同。

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

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

+0

的想法创建一个常量,并分配它,每次从我的脑海里逃脱,但谈论开销,为什么不回到第一次分配字节码指令,并再次做,不需要获取更多数据?我是否了解你? – 2014-09-21 16:32:43

+1

你不想只是无聊地复制字节码。你不想重复使用变量。如果你不得不查看初始值2页的代码,而不是仅仅看到赋值(希望得到一个可读的常量标识符),那么它不会很好读。如果这可以用于某些分配(对于常数值)而不是用于具有副作用的分配,则会破坏对称性。不是很有用,有很多原因,这不是一个好主意,对不起。 – 2014-09-21 16:40:24

+0

@initParam - 是的,如果Java语言有一个'默认'值的概念,那么你可以发明一个'重置'语句,跟踪符号表中的默认值,并生成合适的字节代码来分配默认值重置语句的位置。但是,我越来越不相信这种效用。我想不出任何我的代码的特定情况,其中“重置”将是代码的任何特定简化。 – AgilePro 2014-09-24 21:03:17

1

这段代码如何?我可以理解,从首发的角度来看你的问题,但通常它需要一些更多的实践看,为什么不要求一定的结构:

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

请注意,你不应该巢循环很多,但创建一个“隐藏的循环“至少是危险的,在你的代码中很难跟踪变量,如i

0

如果您想使用当前的Java语言,做你想做的事情,那么只需提供在每个班级要进行“重置”之类的函数:

private void reset() { 
    var = xxx; 
    var2 = yyy; 
    ... 
} 
相关问题