new reformat code option

Hi,

I was just wading through a lot of code with things like
String bla = new String("bla");
in it. Do you think it would be a good idea to have an option that can
automatically remove these (or highlight them ? I can see hardly any use
for that way of creating a String object. Right now, I can't start up
IDEA (simply doesn't run for some reason) so that I can't check if it is
already covered by some function.

Dirk Dittert

0
16 comments
Avatar
Permanently deleted user

Use Search -> Replace...?

0
Avatar
Permanently deleted user

Use Search -> Replace...?

0
Avatar
Permanently deleted user

woops... sorry about the repost :s

0
Avatar
Permanently deleted user

Could be made an inspection?

0
Avatar
Permanently deleted user

String constants are shared through a pool. If you write a code like this:

... you will get:
...which means that s1 and s2 are not only lexicographically equal, but hold reference to the same object.
If you write a code like this:

... you will get:

There are rare cases when you really need these variables to reference different objects.
Still, these cases exist and I had to take care of this once or twice in the past.

Having said that, I would not like these cases reformatted automatically, but an inspection would be nice (or an "on-the-fly" check in the editor).

0
Avatar
Permanently deleted user

Sergei S. Ivanov wrote:

There are rare cases when you really need these variables to reference different objects.


Could you give an example?

Thanks,
Gordon

--
Gordon Tyler (Software Developer)
Quest Software <http://java.quest.com/>
260 King Street East, Toronto, Ontario M5A 4L5, Canada
Voice: 416-643-4846 | Fax: 416-594-1919

0
Avatar
Permanently deleted user


I can picture odd circumstances where you need multiple copies of the same String objects, each thread-local to a different thread. That way operations which might lock on a String (what? don't know. said it was odd) will be able to run without blocking one another.

0
Avatar
Permanently deleted user

Unfortunately, no. Though I definitely remember that I had to take care of it (perhaps in a context of object serialization???).

0
Avatar
Permanently deleted user

Dave Griffith <dave.griffith@trilogy.com> wrote:

I can picture odd circumstances where you need multiple copies of the same
String objects, each thread-local to a different thread. That way
operations which might lock on a String (what? don't know. said it was
odd) will be able to run without blocking one another.


Ok, so what's the bottom line now? File a feature request for an
inspection? Using two distinct String Objects for synchronization is one
of the few reasons why you would want to have two objects. IMHO this is
not a good approach.

Dirk Dittert

0
Avatar
Permanently deleted user

>Ok, so what's the bottom line now? File a feature request for an inspection?

Sounds about right. An inspection with an auto-fix button would cover this nicely.

0
Avatar
Permanently deleted user

The inspection looks quite trivial, it is equivalent to finding usages of java.lang.String(java.lang.String) constructor.

The inspection could be doubled with an automatic check in the editor, which will generate a warning and an intention to remove unnecessary constructor.

0
Avatar
Permanently deleted user

New editor warning/intention: usages of "new String(String)"
http://www.intellij.net/tracker/idea/viewSCR?publicId=12413

New inspection: find usages of "new String(String)"
http://www.intellij.net/tracker/idea/viewSCR?publicId=12412

0
Avatar
Permanently deleted user

I had to do this just yesterday, because I was using Strings as keys in a
WeakHashMap.

"Gordon Tyler" <gordon.tyler@quest.com> wrote in message
news:ba3fci$4nf$2@is.intellij.net...

Sergei S. Ivanov wrote:

There are rare cases when you really need these variables to

reference different objects.
>

Could you give an example?

>

Thanks,
Gordon

>

--
Gordon Tyler (Software Developer)
Quest Software <http://java.quest.com/>
260 King Street East, Toronto, Ontario M5A 4L5, Canada
Voice: 416-643-4846 | Fax: 416-594-1919



0
Avatar
Permanently deleted user

I can think of only one example. The same code was consistently giving different results for for the same data under the "same" conditions. In production - one result, for a small test case - a totally different one. It turned out that the root of the problem was using == for comparing strings instead of equals(). A small failing test case used "new String(string)" to show that sometimes "string" != new String("string").

Sergei S. Ivanov wrote:

There are rare cases when you really need

these variables to reference different
objects.

Could you give an example?

Thanks,
Gordon

--
Gordon Tyler (Software Developer)
Quest Software <http://java.quest.com/>
260 King Street East, Toronto, Ontario M5A 4L5,
Canada
Voice: 416-643-4846 | Fax: 416-594-1919

0
Avatar
Permanently deleted user

Dave Griffith wrote:

I can picture odd circumstances where you need multiple copies of the same String objects, each thread-local to a different thread. That way operations which might lock on a String (what? don't know. said it was odd) will be able to run without blocking one another.


Synchronizing on an immutable object? Very odd indeed.

Ciao,
Gordon

--
Gordon Tyler (Software Developer)
Quest Software <http://java.quest.com/>
260 King Street East, Toronto, Ontario M5A 4L5, Canada
Voice: 416-643-4846 | Fax: 416-594-1919

0
Avatar
Permanently deleted user

Sergei S. Ivanov <jiveadmin@jetbrains.com> wrote:

New editor warning/intention: usages of "new String(String)"
http://www.intellij.net/tracker/idea/viewSCR?publicId=12413

New inspection: find usages of "new String(String)"
http://www.intellij.net/tracker/idea/viewSCR?publicId=12412


well, that happens if you are out having fun for a complete day --
someone submits your feature requests...

Thanks for for submitting these requests ;)

Dirk Dittert

0

Please sign in to leave a comment.