@Supported design issues

Phil Race philip.race at oracle.com
Sun Mar 17 19:47:05 UTC 2013


That isn't at all what @deprecated means.

"Encouraged for new development" doesn't mean everything else is 
@deprecated.
These are all part of the Java SE platform spec, and are documented as such
and are fully supported .. a focus on compatibility is very important to 
a lot
of our customers, even if that's not you.

-phil.

On 3/17/13 12:10 PM, Daniel Latrémolière wrote:
>
>> 1. I suspect that the percentage of deprecated APIs is less than 0.1 
>> % ..
>>     So removing 1 ouf every 1,000 methods is not exactly going to make
>>    a huge difference here.
>>
>> 2. Some methods were deprecated at a time when the policy was to
>>     encourage people to use "newer" API, even though there wasn't
>>     anything very wrong. with the old one.
>>     For example Component.show()/hide() were deprecated
>>     in favour of Component.setVisible(boolean) although as far as I know
>>     there's absolutely no problem with the former.
>>     So such a policy would not be something you could apply 
>> automatically
>>     you'd need to go examine each case to understand it.
> Yes or no for 0,1%, depending if you include some big parts like AWT, 
> Swing, CORBA which are obsolete for many developers, because they are 
> not considered up-to-date for their domains (UI, RPC) and their 
> development is stopped. In this case, deprecated or obsolete API are 
> concerning important domains, like:
>
>   * UI (AWT -> Swing -> JavaFX),
>   * date management (Date -> Calendar -> JSR 310)
>   * RPC (RMI, CORBA, WebServices, REST like JAX-RS: not all are used
>     even if winner depends of project).
>   * LDAP dedicated API are provided by vendors like Apache Directory,
>     OpenDJ for replacing JNDI (not evolving since Java 1.4 and seen
>     not sufficiently specialized).
>   * Logging API is split between java.util.logging, Log4J, SLF4J
>     (depending of project).
>
> Other domains has evolved (like IO, NIO, NIO2) but contains some 
> complex differences: e.g. Path vs. File. Considering File as 
> deprecated in Java7 is frequent even if it is not official: 
> http://stackoverflow.com/questions/6903335/java-7-path-vs-file
>
> Another related problem for a developer is that many parts of API show 
> their age given others enhancements: e.g. Math/StrictMath classes were 
> introduced before Integer/Long/Float/Double classes but would probably 
> not have existed if order was inverse (static methods are notoriously 
> difficult to find, because we don't know by default the class 
> containing them).
>
> Globally, an API designed before Java 1.5 has usually be updated for 
> generics but not for enumerations and only partially for annotations. 
> Now, seeing an int for describing an enumeration in an API became 
> surprising (like Modifier in reflection). Marker interfaces (like 
> java.io.Serializable, java.util.RandomAccess) have same problem 
> against annotations. The reason is simply that Java 1.5 is old: it has 
> 8.5 years. API designed before have accumulated a technical debt and 
> are not seen up-to-date.
>
> I think, I have covered big parts of Java API, concerning all 
> developers, with various names (deprecated, obsolete, technical debt) 
> for only one problem: feeling of an old API and need of cleaning it.
>
> NB: With static methods in interface, you will probably have the same 
> problem in some years:
>
> 1) First round: add factories methods in interface.
> Developer speaking: When I want an instance of an interface it is 
> always difficult to search a subclass and only after that call its 
> constructor. I want to go to the expected interface and call a static 
> factory for all my frequent usecases, then: please add some static 
> methods like followings in List class (and all other interfaces with 
> implementations provided by default):
> public static <E> List<E> newRandomAccessList() {
>    return new ArrayList<E>();
> }
> public static <E> List<E> newLinearAccessList() {
>    return new LinkedList<E>();
> }
>
> 2) Second round (some years after): remove them from public API.
> Developer speaking: I do not need to see AbstractList, ArrayList and 
> LinkedList because I don't call them directly, at least in 99% of my 
> usecases. This is a List-related implementation detail only useful 
> when I want to create my own custom List for a highly specific and 
> performance-sensitive usecase. Remove these classes from public API 
> and put them in another library not seen by me by default, excepted if 
> I really search it.
> In Javadoc, I only see the signature of method, and not the code of 
> method (implementation detail), then I don't want to see these classes 
> only implementing interfaces (implementation detail): the factory 
> method in interface is sufficient with one paragraph in the Javadoc 
> giving tradeoffs of each implementation provided by default.
>
>> 3. Removing methods *from the doc* and *from the runtime* each
>>     have their consequences, from the doc would discourage new uses
>>     but make it harder to understand old code. I think a long ago 
>> ill-fated JSR
>>     for javadoc improvements pondered hiding deprecated methods if
>>     you didn't want to see them. Remiving from the runtime would
>>     break apps, and in some cases people don't have the option to change
>>     and fix.
> Currently, profiles are clearly reducing some API complexity for 
> developer.
> NB: JavaFX doclet seems to remove methods with prefix impl_ from Javadoc.
>
> I think it seems sad, that one of the biggest differences between Java 
> and shorter language like JavaScript is static typing: it give an 
> excellent accuracy when used for automatic refactoring in Java. Given 
> static typing, IDE have added many automatic refactoring and some 
> mechanisms for helping updating code (e.g. generics), JSR 308 has also 
> some inference tools.
>
> But bytecode refactoring (AOT in build process or JIT in ClassLoader) 
> was mostly used for supporting new Java code with old JVM 
> (Retroweaver, Retrotranslator) and not the inverse: supporting old 
> Java bytecode on new JVM. I thought it was possibly used for executing 
> JavaME program on JavaSE JVM but I am not sure.
>
> <utopia>
> I hope of a future where Java easier refactoring (given static typing) 
> would help evolving Java faster by breaking direct compatibility while 
> keeping sufficiently real compatibility (old programs are only 
> slightly slower in compatibility ClassLoader). With easier evolution, 
> Java API can be better organized and developer become happy.
> </utopia>
>
> NB: I never used "Java platform" because I think Java is slowly 
> evolving, for developers, to become more a library for their 
> application, than a platform containing application. Having an 
> integrated JVM in each application is a big change in compatibility 
> requirements, because developer has control on compatibility and it 
> will possibly relax some constraints.
> 1) JavaEE applications are evolving to include server and not inverse: 
> http://www.adam-bien.com/roller/abien/entry/why_not_one_application_per
> 2) JavaSE applications are evolving to include JVM and not to run on a 
> JVM provided by OS: mobile OS prohibiting shared libraries and 
> security problems of OS-global JVM define the rules: 
> http://fxexperience.com/2012/06/application-deployment-with-javafx/
>




More information about the core-libs-dev mailing list