ProblemChastened by the previous recipe, you now wish to write only platform-independent code. SolutionUse readLine( ) and println( ). Never use \n by itself; use File.separator if you must. DiscussionAs mentioned in Recipe 10.12, if you just use readLine( ) and println( ), you won't have to think about the line endings. But a particular problem, especially for recycled C programmers and their relatives, is using the \n character in text strings to mean a newline. What is particularly distressing about this code is that it works sometimes usually on the developer's own platform. But it will surely someday fail, on some other system: // BadNewline.java String myName; public static void main(String argv[]) { BadNewline jack = new BadNewline("Jack Adolphus Schmidt, III"); System.out.println(jack); } /** * DON'T DO THIS. THIS IS BAD CODE. */ public String toString( ) { return "BadNewlineDemo@" + hashCode( ) + "\n" + myName; } // The obvious Constructor is not shown for brevity; it's in the code The real problem is not that it fails on some platforms, though. What's really wrong is that it mixes formatting and I/O, or tries to. Don't mix line-based display with toString( ) ; avoid "multiline strings" output from toString( ) or any other string-returning method. If you need to write multiple strings, then say what you mean: // GoodNewline.java String myName; public static void main(String argv[]) { GoodNewline jack = new GoodNewline("Jack Adolphus Schmidt, III"); jack.print(System.out); } protected void print(PrintStream out) { out.println(toString( )); // classname and hashcode out.println(myName); // print name on next line } |