48 comments

[ 2.8 ms ] story [ 106 ms ] thread
Not having an underscore for a variable name is un-American.

I will have a word with Ryan Gosling.

Java 8 already warns about the use of _.
Wonder what they'll do with `_`?

At last year's JLS the keynote mentioned that reserving underscore did not mean that Java is becoming Scala. And yet, what else are they going to with it other than to slowly integrate Scala idioms into the language?

If alternative JVM languages gain enough traction perhaps archaic boilerplate like having to define Java getters/setters, equals, hashCode and toString on data classes will replaced sooner than later with terse "modern" equivalents found in C#, Scala, etc.

The use of _ as a discardable placeholder has been present in many languages in the past, such as Haskell and Prolog. These aren't necessarily Scala-isms that Java is adopting; they have a much richer history.
The way Scala uses them is very different from Haskell or Prolog. They are used to create lambdas, not discardable placeholders. E.g. `List(1, 2, 3) map (_ + 1)`.
_ has a lot uses in Scala, one of them being to create lambdas, another as placeholders when pattern matching. for example val List(a, b, _, d) = List(1, 2, 3, 4)
Good question; to me _ has no obvious meaning. And in general Java is verbose - ie. the keyword for private is "private" rather than some shorthand or symbol. Maybe they should just not use it.
Will $_ still be valid? You could use that instead.
You have (almost) the full range of unicode at your disposal - have you considered that maybe މ is more meaningful variable name?
That's a bit harder to type.
Not if you have a Thaana keyboard!
Mixing RTL and LTR is a nuisance, though; that's why ℵ is a good variable name and א is not.
"consistency is the hobgoblin of little minds", said a well known and frequently quoted man[0].

I can't speak to the pros and cons of ℵ-vs-א, but in other geographies I have found mixing RTL and LTR to be a real PITA. Especially if one is touch-typing and not eyeballing the screen from time-to-time. Of course, before Unicode, we got to tell developers: "Just use ASCII for variable names. That's why God gave us 127 keys."

[0] Some call him arrogant. Others say that I intentionally truncated the quote for my own evil purposes. Who is to judge?

Please give us goto and const back!
So I've looked for an explanation beyond "it's done", but save your time, there is none.

This is Java, starting tomorrow it's a keyword because why not, but let's keep in type erasure or the software on our Java Ring (TM) breaks.

For a language I find as reasonably designed as Java, this is stupid.

Add a new key"word", don't deprecate a whole fucking character in a language that's been around for twenty years.

It pains me to consider the horrific amount of code this will break. The lifetimes of hours spent deleting _ that would have been writing whimsical poetry in a moonlit garden or curing cancer.

I'm not surprised I guess given that Java is "owned" by Oracle now. Hopefully they kill it off quickly so we can get the migrations to openjdk overwith.

> The lifetimes of hours spent deleting _

that's... quite a lot of _

The sheer amount of Java code written is nearly unfathomable. Maybe 3 million developers each churning out 20000 lines a year. That's about 60 billion lines of Java code per year. There could easily be over a trillion lines of Java out there.
If that is true, it's stuff for nightmares.

Here is something I made to lighten the mood: https://i.imgur.com/qzOPn85.png

.. or maybe this is even scarier. I'm not sure.

edit: downvotes from java devs incoming :D

Hahahaha

Edit: I'm a Java guy too, don't get why some people get so butthurt over things :)

At least it's not JavaScript with infinity,null,undefined, and NaN. Oh and null!=null which is hilarious

LOL yeah.. don't get me started about JS :D.

I more of a C++ guy, but I like Java very much and have used it extensively in the past. I personally like a good C/C++ joke and can't understand why the Java devs are so serious. Apparently nobody is allowed to joke about Java, it's serious business :D

For what it's worth, you should _always_ be using triple-equals in Javascript unless you have an overwhelmingly good reason not to. Many of the weird Javascript-isms people like to complain about are due to surprising type coercions, which don't happen with triple-equals (which behaves as you would expect- value equality without type coercion for primitive types and reference equality otherwise.)
For someone who uses a more than one language on a regular basis, triple equals is an annoying break with convention. It shouldn't be that easy to make a mistake by simply missing an extra character. This is one of many reasons I've taken to using TypeScript for all of my web frontend projects.
However you still run into the same problems with > , < , <= , and =>. So you need to really really understand the corner cases (same as with C++).
You mean NaN != NaN. null == null is true, and null != null is false.

NaN != NaN is surprising, but is not unique to JavaScript. As far as I know, this is the case in every language, and is mandated by the IEEE 754 specification.

However, it does come up in JavaScript more often than other places, since NaN is really easy to get (+{} => NaN, 1 - '' => NaN, etc, etc).

In SQL, 'NULL <> NULL' is true as well, you have to use 'NULL IS NULL' instead, so the concept has a long and somewhat respectable pedigree...
It is the string '_' that turns into a keyword. Names like _buh or BUH_HUH will still be valid.
Never seen single underscore as variable, field or method name and never seen any naming convention that allowed that (and I've read a lot of open source code too). Conclusion: it's a pain only for those who didn't care about readability of their code and it's definitely not the end of the world.
I've seen it popping up a lot lately. It's used as an identifier for lambda functions, indicating "i must use a variable identifier here, but I don't use it"

someObject.doSomething(_ -> isDerp());

Exactly the case when you get warning in Java 8. Bad code written by lazy devs and now it's time for them to pay.
No it's not, it's illegal to use _ as a lambda parameter.
> Add a new key"word"

That's exactly what they're doing. And exactly why many languages are hesitant to add new keywords ever, since you could be using anything as a variable name. (Hence the practice of reserved words which might become keywords in the future.)

> I'm not surprised I guess given that Java is "owned" by Oracle now. Hopefully they kill it off quickly so we can get the migrations to openjdk overwith.

What makes you think that OpenJDK isn't owned by Oracle, or that OpenJDK won't add the _ keyword, given that it's part of the Java 9 spec?

I'll admit the last part was just using a good opportunity to diss Oracle. The longer the keyword the less name collisions there will be in general, using a single character is absolute worst case if you want to avoid breaking code
I highly doubt that, seems like you'd get a lot more name collisions if you make something commonly used as a variable (such as index or length) a keyword instead of the seldomly-used underscore.
"It pains me to consider the horrific amount of code this will break"

Almost none.

_ was never encouraged, promoted, it wouldn't really fit with any sort of Java coding practice at all.

So I don't think it will be a huge issue.

Looking forward to have the same feature in JavaScript!

/sees the horror on the faces of all the lodash users/

Ok that was not a good idea

Interestingly, _ is already reserved in the node.js console, so you have to import lodash under a different name.
Seems to work fine for me.

    teo  ~  node -v                                                                                                                                                                                                                                 
    v7.3.0
    teo  ~  node                                                                                                                                                                                                                                    
    > _ = "hi"
    Expression assignment to _ now disabled.
    'hi'
    > _
    'hi'
That's a fluke ;)

    $ node
    > _ = "hi"
    'hi'
    > _
    'hi'
    > foo = "bar"
    'bar'
    > _
    'bar'
(See mattnewton's reply for explanation.)

    > _ = "hi"
    Expression assignment to _ now disabled.
    'hi'
    > "bar"
    'bar'
    > _
    'hi'
    > foo = "bar"
    'bar'
    > _
    'hi'
Neat, looks like newer versions detect and correct for it. TIL.