【问题标题】:Why in java there is no reset option for variables [closed]为什么在java中没有变量的重置选项[关闭]
【发布时间】:2014-09-21 16:20:29
【问题描述】:

有时当我们声明和初始化一个变量时,假设我们有一个int i =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++;
            }
        }
    }
}

然后在某个时候(这里在第 11 行)我们需要重新初始化 then 变量,如果我们有任何语言功能自动执行它不是很好,例如

reset:i

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

【问题讨论】:

  • 如果初始化为有副作用的表达式呢?
  • 您建议的语法类似于标签,这会令人困惑。我只会为初始值分配一个常量,并在您重置它时分配该常量。
  • SLaks:假设只有在分配常量值时才能进行此重置
  • Gabor:在团队中工作时,更容易忘记另一个开发者分配的特定值
  • 不是一个好主意,但是实现一个 init() 方法来重置可变类的字段可能是一个好主意,具体取决于该类的使用方式。

标签: java initialization language-features primitive-types


【解决方案1】:

我们需要重新初始化 then 变量,如果我们有任何语言功能自动执行它不是很好吗?

没有

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

没有

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

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

【讨论】:

  • 你的回答不是很干。
  • +1 用于提及“范围”
【解决方案2】:

初始化行

int i = 10;

只需创建字节码指令来将值 10 分配给变量。该任务与任何其他任务没有什么不同。

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

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

【讨论】:

  • 创建一个常量并每次都分配它的想法从我的脑海中消失了,但是谈到开销,为什么不回到第一个分配字节码指令,然后再做一次,不需要额外的数据?,我理解你吗?
  • 你不想随便复制字节码。您也不想随意重用变量。如果您必须查找初始值 2 页代码而不是仅查看分配(希望是可读的常量标识符),那么它的可读性将不高。如果可以对某些赋值(到常量值)而不是对具有副作用的赋值进行此操作,则会破坏对称性。不是很有用,有很多原因说明这不是一个好主意,抱歉。
  • @initParam - 是的,如果 Java 语言有一个“默认”值的概念,那么您可以发明一个“重置”语句,跟踪符号表中的默认值,并生成正确的字节代码来分配默认值来代替 reset 语句。但是,我越来越不相信它的实用性。我想不出我的代码的任何特殊情况,其中“重置”会是对代码的任何特殊简化。
【解决方案3】:

这段代码呢?我可以从初学者的角度理解您的问题,但通常需要更多练习才能了解为什么不需要某些构造:

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)变得非常困难。

【讨论】:

    【解决方案4】:

    如果你想使用当前的 Java 语言来做你想做的事,那么只需在你想执行“重置”的每个类中提供一个函数,例如:

    private void reset() {
        var = xxx;
        var2 = yyy;
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 2017-09-27
      • 2016-04-06
      • 2015-01-23
      • 2019-11-21
      相关资源
      最近更新 更多