Libraries updates for extensions methods

Brian Goetz brian.goetz at oracle.com
Mon Aug 13 07:31:50 PDT 2012


We're planning to introduce default methods to selected existing JDK 
classes on a resources-available basis.  An update of "all relevant JDK 
libraries", however, would be a massive effort, and is not currently 
resourced by Oracle.  (But OpenJDK is an open-source project, so others 
like yourself might be inclined towards such work.)

I'm not an expert on DOM, but some of the examples you provide -- for 
example, default implementations throwing exceptions for "optional" 
methods -- seem like typical intended use cases for default methods. 
(For example, we'll add a default to Iterator.remove that throws UOE.)

On 8/13/2012 10:16 AM, Daniel Latrémolière wrote:
> Are you planning to update all relevant JDK libraries with extensions
> methods, even parts without parallelism but with large interfaces and
> repetitive methods like org.w3c.dom.*?
>
> A same DOM node can support multiple interfaces like some interfaces of
> DOM Core, DOM Traversal and Range, DOM Load and Store, etc. Many of the
> interfaces have repetitive methods.
> It would also allow the big table at the beginning of Node javadoc to be
> written in sub-interface extensions methods and not in implementation
> classes.
> It would not be a big change in Java world, but could be seen as cleaner
> code (in my opinion), which is always better, even only when debugging.
>
> Thanks,
> Daniel.
>
> |public interface Node {
>       // NodeType
>       public static final short ELEMENT_NODE = 1;
>       public static final short ATTRIBUTE_NODE = 2;
>       public static final short TEXT_NODE = 3;
>       public static final short CDATA_SECTION_NODE = 4;
>       public static final short ENTITY_REFERENCE_NODE = 5;
>       public static final short ENTITY_NODE = 6;
>       public static final short PROCESSING_INSTRUCTION_NODE = 7;
>       public static final short COMMENT_NODE = 8;
>       public static final short DOCUMENT_NODE = 9;
>       public static final short DOCUMENT_TYPE_NODE = 10;
>       public static final short DOCUMENT_FRAGMENT_NODE = 11;
>       public static final short NOTATION_NODE = 12;
>       public String getNodeName();
>       public String getNodeValue() throws DOMException;
>       public void setNodeValue(String nodeValue) throws DOMException;
>       public short getNodeType();
>       public Node getParentNode();
>       public NodeList getChildNodes();
>       public Node getFirstChild();
>       public Node getLastChild();
>       public Node getPreviousSibling();
>       public Node getNextSibling();
>       public NamedNodeMap getAttributes();
>       public Document getOwnerDocument();
>       public Node insertBefore(Node newChild, Node refChild) throws
> DOMException;
>       public Node replaceChild(Node newChild, Node oldChild) throws
> DOMException;
>       public Node removeChild(Node oldChild) throws DOMException;
>       public Node appendChild(Node newChild) throws DOMException;
>       public boolean hasChildNodes();
>       public Node cloneNode(boolean deep);
>       public void normalize();
>       public boolean isSupported(String feature, String version);
>       public String getNamespaceURI();
>       public String getPrefix();
>       public void setPrefix(String prefix) throws DOMException;
>       public String getLocalName();
>       public boolean hasAttributes();
> }|
>
> A subinterface, like an attribute, add new abstract methods:
> |public interface Attr extends Node {
>       public String getName();
>       public boolean getSpecified();
>       public String getValue();
>       public void setValue(String value) throws DOMException;
>       public Element getOwnerElement();
> }
> |
> But Attribute define default behaviour for many superinterface methods
> and this behaviour can be expressed with extension methods:
> |public interface Attr extends Node {
>       public String getName();
>       public boolean getSpecified();
>       public String getValue();
>       public void setValue(String value) throws DOMException;
>       public Element getOwnerElement();
>       public default String getNodeName() {
>           return getName();
>       }
>       public ||default ||String getNodeValue() throws DOMException {
> ||return ||getValue();
>       }
>       public ||default ||void setNodeValue(String nodeValue) throws
> DOMException {
>           setValue(nodeValue);
>       }
>       public ||default ||short getNodeType() {
>           return Node.ATTRIBUTE_NODE;
>       }
>       public ||default ||Node getParentNode() {
>           return getOwnerElement();
>       }
>       public ||default ||NodeList getChildNodes() {
>           return EMPTY_NODE_LIST;
>       }
>       public ||default ||Node getFirstChild() {
>           return null;
>       }
>       public ||default ||Node getLastChild() {
>           return null;
>       }
>       public ||default ||NamedNodeMap getAttributes() {
>           return null;
>       }
>       public ||default ||Node insertBefore(Node newChild, Node refChild)
> throws DOMException {
>           throw new DOMException();
>       }
>       public ||default ||Node replaceChild(Node newChild, Node oldChild)
> throws DOMException {
>           throw new DOMException();
>       }
>       public ||default ||Node removeChild(Node oldChild) throws
> DOMException {
>           throw new DOMException();
>       }
>       public ||default ||Node appendChild(Node newChild) throws
> DOMException {
>           throw new DOMException();
>       }
>       public ||default ||boolean hasChildNodes() {
>           return false;
>       }
>       public ||default ||void normalize() {
>       }
>       public ||default ||boolean hasAttributes() {
>           return false;
>       }
> }|
>


More information about the lambda-dev mailing list