Stories
Slash Boxes
Comments
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

use Perl Log In

Log In

[ Create a new account ]

jdavidb (1361)

jdavidb
  (email not shown publicly)
http://voiceofjohn.blogspot.com/

J. David Blackstone has a Bachelor of Science in Computer Science and Engineering and nine years of experience at a wireless telecommunications company, where he learned Perl and never looked back. J. David has an advantage in that he works really hard, he has a passion for writing good software, and he knows many of the world's best Perl programmers.

Journal of jdavidb (1361)

Friday September 26, 2008
01:25 PM

Java gravel of the day: no block scoped variables

[ #37548 ]

I can't make this work because the inner block declares a variable of the same name as one in the outer block. Apparently variables belong to the method or class in which they are declared, not to the block in which they are declared, so I therefore can't write a short little temporary block for debugging that happens to push a variable in the outer scope off into shadow just for a moment:

void methodName() {
  int i = 7;
  for (int j = 0; j < 10; j++) {
    int i = j * 2;
  }
}

Perl can do this. scheme can do this. C can do this. Why can't Java?

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
 Full
 Abbreviated
 Hidden
More | Login | Reply
Loading... please wait.
  • JavaScript 1.7 has block scoped variables. I'm not sure what browsers besides FF 2 and newer support it though.

    <html>
    <head>
    <title>Block Scoped Variables</title>
    <script type="application/javascript;version=1.7">

    function methodName() {
        let (i = 7) {
            document.writeln('start: i is ' + i + '<br>');
            for( var j = 0; j < 10; j++ ) {
                let (i = j * 2) {
       

  • According to the first hit I got for "java block local variables" [sun.com], it looks like the variable declared in your "for" statement is actually outside the scope of that local block, but otherwise, the scope of a local variable inside a block is in fact inside the block and may temporarily obscure outer variables.

    Now in JavaScript, the rules are different, but I presume you're smart enough not to say "Java" when you mean "JavaScript".

    --
    • Randal L. Schwartz
    • Stonehenge
    • Considering he does Java programming most of the time now, I doubt he'd mistakenly call JavaScript Java.

      I haven't written any Java since about 1998 and I try not to read it too often as it usually makes my head hurt. ;)

      But if I'm reading this right, it looks like the for loop would need to be enclosed inside another block for it to work like J. David is expecting...

      void methodName() {
        int i = 7;
        {
          for (int j = 0; j < 10; j++) {
            int i = j * 2;
          }

    • Apparently my example has confused nearly everyone I've asked about this. Yes, I meant Java. The for loop actually has nothing to do with it. Let me say it in Perl, and drop the for:

      sub my_routine
      {
        my($i) = @_;
        {
          my $i = 18;  # different $i from the other one
        }
      }

      Of course, you can argue all day that declaring a variable in an inner block that shadows a variable in an outer block like this is a bad idea. It probably is. :) But the question for me is: did Java designe

      --
      J. David works really hard, has a passion for writing good software, and knows many of the world's best Perl programmers
  • Reusing a variable name in the same method is a TERRIBLE idea and is a beartrap waiting for some future maintenance programmer. Why would you want to do that?

    This sounds like a great opportunity for a Perl::Critic policy.