有没有办法强制变量在Java中不存在?

时间:2017-04-25 01:13:16

标签: java performance variables scope

基本上,我的目标是通过"删除"尽可能高效。我完成的变量,即使仍在范围内。到目前为止,我一直在使用if(true)手动创建一个定义变量生命周期的范围,但我正在寻找像var.close()这样的函数,唯一的目的是使变量基本上超出范围,并且不再为其保留内存位置。

我在下面使用的示例显然可以使用for()来回避这个特定的实例(赋值我不想使用for()),但我的关注比用作索引的变量更广泛。 (忽略存在的任何其他逻辑/语法错误,因为我还没有对此进行校对)

package root;
import javax.swing.JOptionPane;
public class DebugEight4
{
   public static void main(String[] args)
   {
      String array[] = new String[100];
      String entry = " ";
      final String STOP = "/']";

      StringBuffer message = new StringBuffer(
              "The words in reverse order are:\n"
              );

      if(true)
      /* 
       *forces x out of scope 
       * after while statement ends
       */
      {
          int x = 0;
          while(!entry.equals(STOP))
          {
              entry = JOptionPane.showInputDialog(null,
                "Enter another word\n" +
                "Enter " + STOP + " when you want to stop"); 
              if(!entry.equals(STOP) && x != 100)//prevents fragmentation error
              {
                  array[x] = entry;
              }
              else
              {
                  JOptionPane.showMessageDialog(null, "That\'s all! Let's see the results.");
              }
              ++x;
          }
      }/* end x scoping if
        * If the if(true) wasn't here, x would still exist!
        */

      for(int y = array.length-1; y > 0; --y)
      {
         message.append(array[y]);
         message.append("\n");
      }
      JOptionPane.showMessageDialog(null, message);
   }
}

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

这正是范围的用途。您不需要发明自己的范围系统。任何变量都应在尽可能小的封闭范围内声明。但就你所需要而言,这就是你的意思。它是一个可见性原则,而不是一个效率原则,因为方法所需的所有堆栈都是在方法的入口处分配的,并且内部作用域不以任何方式对应于字节码指令。

答案 1 :(得分:0)

创建更有限的范围很容易。只需创建一个新块:

public static void whatever() {
    int a = 5; // Exists until end of method
    {
        int b = 5; // Exists until end of outer block
        {
            int c = 5; // Exists until end of inner block
        }
        // c is no longer accessible
    }
    // b is no longer accessible
}

我建议不要这样做有几个原因:

  • 阅读起来比较难获得
  • 编译器或JIT can automatically figure out the lifetime of variables并自动处理您尝试执行的操作
  • 您不能以这种方式重叠变量生命周期(嵌套意味着最嵌套的变量必须在堆栈之前更少嵌套的变量之前到期)