I think I might have caused some confusion by being too lazy: Ex is meant to be a particular checked exception, not a shorthand for "Exception".
If you are referring to your sneaky throws: I consider them out of scope. There are many ways to subvert Java code, particularly if reflection is allowed. If anyone throws a checked exception in code that was explicitly designed not to throw it (after all that is what the safe/unsafe distinction is for), then so be it. Java is not strong enough to stop someone with that attitude from breaking things. Peter Reinier Zwitserloot wrote: > Peter, your code sample is very much broken - exceptions are just > silently swallowed in the safe version. Sure, you declared that the > exception can't happen, but as I've mentioned a few times already, > because checked exceptions aren't enforced on the JVM level, they can > occur at _any_ time. Therefore, occasionally, such code would swallow > an exception. No good. > > I'm fairly sure that turning every java method into BGGA-style > "throws" containing generics is going to be just as annoying, if not > far worse, than the current situation. The problem with checked > exceptions is that all implementations so far suck far worse than they > help. I remain convinced that java's checked exception system with an > explicit command to get around the checked exception system is the > most practical (though it is of course not the most elegant). > > > On Aug 21, 11:43 am, Peter Becker <peter.becker...@gmail.com> wrote: > >> As I said: in cases where you want to have a version of your code where >> the exception bubbles up and one where it doesn't you'll get the >> duplication. I think that is usually a bad idea, although I must admit >> the wrapper case you describe is an exception since the layer is the >> same. I don't see that problem spread too far, though. >> >> If your code is really that big, I'd even consider this: >> >> public class UnsafeWrapper implements UnsafeInterface { >> protected UnsafeInterface orig; >> ... >> public doAction() throws Ex { >> ... >> orig.doAction(); >> .... >> } >> >> } >> >> public class SafeWrapper implements SafeInterface { >> ... >> public doAction() { >> ... >> try { >> orig.doAction(); // call on UnsafeWrapper.doAction() >> } catch(Ex e) { >> // won't happen >> } >> } >> >> } >> >> Not very elegant, but avoids major duplication. >> >> I believe that with union types the whole problem would disappear since >> the subtyping would allow using generics to create the different >> versions. As long as exceptions are not part of the type signature it >> won't happen in Java. >> >> Peter >> >> >> >> Reinier Zwitserloot wrote: >> >>> 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 -~----------~----~----~----~------~----~------~--~---