Peter, I still don't see how that'll avoid code duplication.

Let's say, for argument's sake, that a FilterInputStream's read()
method contains 4 pages of complex code. This code calls back into the
filtered stream's read method loads of times. How would we avoid
duplicating these 4 pages if we want 2 types of FilterInputStream: One
that wraps a Safe InputStream and does not throw IOException, and one
that wraps an unsafe InputStream and does throw IOException.

On Aug 20, 9:36 am, Peter Becker <peter.becker...@gmail.com> wrote:
> Here you go (three files):
>
> ===== test/Unsafe.java======
> package test;
>
> import java.io.IOException;
>
> public interface Unsafe {
>     void method() throws IOException;
>
> }
>
> ===== test/Safe.java ======
> package test;
>
> public interface Safe extends Unsafe {
>     void method();
>
> }
>
> =====test/Test.java=======
> package test;
>
> import java.io.IOException;
>
> public class Test {
>     class UnsafeImpl implements Unsafe {
>         @Override
>         public void method() throws IOException {
>             throw new IOException(); // ok
>         }
>     };
>
>     class SafeImpl implements Safe {
>         @Override
>         public void method() {
>             // can't throw here
>         }
>     };
>
>     void method1(Unsafe unsafe) {
>         unsafe.method(); // error, need to deal with exception
>     }
>
>     void method2(Safe safe) {
>         safe.method(); // ok
>     }
>
> }
>
> ==========
>
> The one trick is to realize that the safe version is actually the more
> specific one. If you think of the exception in terms of the type union
> (not accurate, but a decent analogy), then Unsafe.method() returns
> void|IOException while Safe.method() returns void, which is a more
> specific type, thus the return types are co-variant.
>
> More generally you can argue that Safe.method() makes stronger
> guarantees about its behavior than Unsafe.method(), so subtyping is
> legal. Apart from the one marked position the code above is legal Java.
>
>   Peter
>
>
>
> Reinier Zwitserloot wrote:
> > On Aug 20, 12:21 am, Peter Becker <peter.becker...@gmail.com> wrote:
>
> >> No implementation would be duplicated, the safe version could be a
> >> subtype of the unsafe one. Not too many interfaces will face that
> >> problem. To me it seems much better than not distinguishing.
>
> > Can you show me how this would work?
>
> > I have a hard time seeing how you can do that without (oh, the irony),
> > employing some sort of sneakythrow mechanism.
>
> > I guess we will have to agree to disagree here, but I'm fairly sure
> > the idealism lost in allowing sneakythrow is minor, whereas the amount
> > of pain you can solve is sizable. (in practice, due to widespread bad
> > API design we all know will never ever get fixed, such as in the core
> > JDK)
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "The 
Java Posse" group.
To post to this group, send email to javaposse@googlegroups.com
To unsubscribe from this group, send email to 
javaposse+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/javaposse?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to