Re: what the benefit is by using annotation, like "@Immutable" ?
Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> writes:
Tom Anderson <twic@urchin.earth.li> wrote:
To make this method safe, you either have to synchronize the whole thing,
or do the update of calculated and code atomically at the end.
I'd have expected that if "calculated" was assigned *after* "code", that
would suffice without further synchronisation or volatile-ity of the fields.
Am I still too naive?
The beauty of the String approach, of using a special value of code to
indicate that it had not been calculated, is that you don't need any
synchronisation for safety, just the JLS's guarantee of no word tearing in
writes and reads of int variables. Because it combines the flag and value
fields in a single int, they are read and written atomically as a pair. Of
course, were you to do this, you might want to avoid String's ability to
generate a code which looks like a flag indicating the lack of a code (ie
0). But then, you might think the one in four billion chance of it
happening was insignificant.
I guess, I'd have spent one "if (h==0) { h=42; }" just before "hash = h;"
After the calculation loop, that extra "if" really wouldn't have hurt.
Has anyone found e.g. an english dictionary-word with hashCode 0, yet?
Or perhaps the name of some commonly used class in Java standard library
or some other String likely occurring in innocent code?
All strings of the form "\0", "\0\0", "\0\0\0", etc. Not something
you'll find in a dictionary, but it could conceivably occur in some
applications. For ordinary words, I ran the following against the
dictionary file on a Linux system and got no hits.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ZeroHash {
public static void findZeroHashes(BufferedReader in) throws IOException {
String s;
while ((s = in.readLine()) != null) {
if (s.hashCode() == 0) {
System.out.println(s);
}
}
}
public static void main(String[] args) throws IOException {
findZeroHashes(new BufferedReader(new InputStreamReader(System.in)));
}
}
--
Jim Janney