Knut Anders Hatlen wrote:
Andreas Korneliussen <[EMAIL PROTECTED]> writes:

This is very interesting.

However, isn't it the job of the compiler to figure out that the
signatures of an interface has been implemented ?

I did the following change to EmbedResultSet40:

I added "implements java.sql.ResultSet" in the class definition. The
compilation then failed with:

     [javac]
     
/home/ak136785/devel/derbydev/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet40.java:33:
     org.apache.derby.impl.jdbc.EmbedResultSet40 is not abstract and
     does not override abstract method
     updateNCharacterStream(java.lang.String,java.io.Reader,int) in
     java.sql.ResultSet
.. + warnings


The base class of EmbedResultSet40 also claims that it implements
java.sql.ResultSet, however it is compiled against a previous jre
version which does not have the new methods.  By declaring that the
EmbedResultSet40 class implements java.sql.ResultSet, I make the
compiler check that the class implements the interface when compiling
it with the 1.6 jre.

Yes, I have observed this too, and I agree that it is the job of the
compiler to check this. However, I think there are some good reasons
for having a test as well:


I agree that you should keep the test as well - at least as long as the current model for reuse is kept.

  1) Relying on the developers to include "implements java.sql.(...)"
     in the subclasses is error-prone since the compiler doesn't
     complain if it's missing.


It is less error-prone than not including it, however it does not solve all problems.

  2) There might be cases where we don't have a separate 4.0 class,
     either because it's forgotten or because the new JDBC 4.0 methods
     could be compiled with older JDKs.


In such cases, one could make a separate class, which uses delegation to reuse the JDBC 3 methods, and implements the JDBC 4 methods. The new class should then be compiled against jdk1.6 rt.


  3) Writing the test was a lot more fun than going through all
     classes and adding "implements foo"! :)

I think it would be good for all EmbedXXX40 to declare which interface
they are supposed to implement, and then the compiler will make sure
that all signatures are satisfied.

+0.5

It might be a good idea, but it might also just give us a false sense
of security. For EmbedResultSet40 this would expose the errors, but it
wouldn't help us to find that something is missing in EmbedClob.


Yes, it would only solve parts of the problem, therefore I also suggest changing the model to delegation, and to always make a new class if a JDBC interface has been extended with new methods, and finally compile the JDBC classes against the correct runtime libraries.

Andreas

Also, I think this also indicates that we should consider using
delegation instead of inheritance for code reuse.

+1


Reply via email to