Saturday, 10 May 2008

Java Puzzlers by Bloch & Gafter

Summary of most important things in this book:

  • To escape characters in regular expression use Pattern.quote("."). To change replacement string Matcher.quaoteReplacement(String).
  • In java are statemant labels
  • Special values:
Double.NaN
Double.POSITIVE_INFINITY
  • Be careful:
Integer.MIN_VALUE = -Integer.MIN_VALUE
Long.MIN_VALUE = - Long.MIN_VALUE
  • Java exception checking is not enforced be the virtual machine
  • Class.newInstance can throw checked exceptions that it does not declare
  • Generic type information is checked at compile time not at runtime.
  • When a program calls a static method, the method to be invoked is selected at compile-time, based on compile-time type of a qualifier
  • Static methods annnot be overridden, they can only be hidden
  • Never call overridable methods from constuctors
  • AtomicLong - object with implementation for synchonisation
  • You must override hashcode() whenever you override equals
  • Integer literals begining with 0 are in interpreted as octal values
  • Math.abs is not guaranteed to return nonnegative result. For Integer MIN_VALUE and for Long MIN_VALUE it does not
  • Methods in object are overwritten and fields are only hidden but can be other types.
  • It is possible to hide variables, nested types and static methods.
  • A package-private method cannot be directly overridden by a method in a different package
  • Thread.join calls Object.wait on the Thread instance representing the Thread being joined. This releases the lock for the duration of the wait
  • You cannot legally access a member of a nonpublic type from an other package
  • The constructor of a non-static nested class is compiled such that it has as its first parameter an additional implicid parameter representing the immediately enclosing instance. So avoid using reflection to instantiate inner classes
  • PrintStream.write(int) is the only output method that does not flush a PrintStream
  • You must drain the output stream of a child process in order to ensure its termination. The same goes for the error stream.
  • Calling Thread.interrupted always clears the interrupted status of the current thread
  • References to constant fields are resolved at compile time to the constant values they denote.

Wednesday, 6 February 2008

Effective Java by Bloch - Second

  • Immutable object are thread-safe without need of synchronization
  • Using immutable objects is costly if we change it frequently because every time new object is created. So think about using StringBuffer over String and BitSet over BigInteger
  • Immutable classes are recommended to be final or methods to be final, what allow changes in new releases.
  • For serialization if any field in immutable object is mutable then you have to provide method readObject or readResolve
  • Think it over whether choose composition pattern or inheritance
  • Documentation of methods to be overriiden in subclass should have comment staring with: This implementation ... It should describe hot it uses other methods and how their overriding would affect results.
  • Constructors must not involve overridden methods through constructors sequence called.
  • Neither clone nor readObject may invoke overridden methods directly or indirectly.
  • To eliminate different usage of method in class and subclass you can use private helper methods and prepare methods to be overrridden to use this helper method.
  • Common usage of an anonymous class is to create object such as a Thread, Runnable, TimerTask
  • Decision which overloaded method is chosen is made on compile-time. (not runtime)
  • Overriding methods is made on run-time.
  • For money calculation use BigDecimal, int or long
  • Rather use standard exceptions like IllegalArgumentException, IllegalStateException, NullPointerException, IndexOutOfBoundsException, ConcurrentModificationException, UnsupportedOperationException, ArithmeticExceptioln, NumberFormatException.
  • Primitive variables long and double are not written or read atomically.
  • Volatile attribute on variable guarantees that any thread will see the most recently written value
  • Static fields in private static classes are initialized on first use
  • Never invoke wait outside a loop.