<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki.apidesign.org/skins/common/feed.css?116"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.apidesign.org/index.php?action=history&amp;feed=atom&amp;title=TypedBuilder</id>
		<title>TypedBuilder - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.apidesign.org/index.php?action=history&amp;feed=atom&amp;title=TypedBuilder"/>
		<link rel="alternate" type="text/html" href="http://wiki.apidesign.org/index.php?title=TypedBuilder&amp;action=history"/>
		<updated>2026-05-01T06:02:57Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.12.0rc1</generator>

	<entry>
		<id>http://wiki.apidesign.org/index.php?title=TypedBuilder&amp;diff=10217&amp;oldid=prev</id>
		<title>JaroslavTulach: New page: TBD  I need to write a builder for HTML DOM elements. Or rather React.js elements. How can we create a builder for all the difference elements without generating many Java clas...</title>
		<link rel="alternate" type="text/html" href="http://wiki.apidesign.org/index.php?title=TypedBuilder&amp;diff=10217&amp;oldid=prev"/>
				<updated>2020-08-30T11:32:21Z</updated>
		
		<summary type="html">&lt;p&gt;New page: &lt;a href=&quot;/wiki/TBD&quot; title=&quot;TBD&quot;&gt;TBD&lt;/a&gt;  I need to write a builder for &lt;a href=&quot;/wiki/HTML&quot; title=&quot;HTML&quot;&gt;HTML&lt;/a&gt; DOM elements. Or rather React.js elements. How can we create a builder for all the difference elements without generating many &lt;a href=&quot;/wiki/Java&quot; class=&quot;mw-redirect&quot; title=&quot;Java&quot;&gt;Java&lt;/a&gt; clas...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[TBD]]&lt;br /&gt;
&lt;br /&gt;
I need to write a builder for [[HTML]] DOM elements. Or rather React.js elements. How can we create a builder for all the difference elements without generating many [[Java]] classes? Here is an idea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public abstract class ElemBuilder {&lt;br /&gt;
    ElemBuilder() {&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static &amp;lt;T extends ElemBuilder &amp;amp; Href&amp;lt;T&amp;gt; &amp;amp; ClassName&amp;lt;T&amp;gt;&amp;gt; T a() {&lt;br /&gt;
        return (T) new Impl(&amp;quot;a&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static &amp;lt;T extends ElemBuilder &amp;amp; ClassName&amp;lt;T&amp;gt;&amp;gt; T b() {&lt;br /&gt;
        return (T) new Impl(&amp;quot;b&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public interface ClassName&amp;lt;T&amp;gt; {&lt;br /&gt;
        T className(String className);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public interface Href&amp;lt;T&amp;gt; {&lt;br /&gt;
        T href(String url);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private static final class Impl extends ElemBuilder &lt;br /&gt;
    implements ClassName&amp;lt;ElemBuilder&amp;gt;, Href&amp;lt;ElemBuilder&amp;gt; {&lt;br /&gt;
        private final String name;&lt;br /&gt;
&lt;br /&gt;
        private Impl(String name) {&lt;br /&gt;
            this.name = name;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        @Override&lt;br /&gt;
        public ElemBuilder className(String className) {&lt;br /&gt;
            return this;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        @Override&lt;br /&gt;
        public ElemBuilder href(String url) {&lt;br /&gt;
            return this;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The implementation of the builder '''Impl''' implements all the element interfaces, but each builder creating method - e.g. '''a''' or '''b''' - specify the attributes that are supported with the use of generics: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;T extends ElemBuilder &amp;amp; Href&amp;lt;T&amp;gt; &amp;amp; ClassName&amp;lt;T&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
as such the IDE provides reasonable code completion.&lt;br /&gt;
&lt;br /&gt;
[[Category:APIDesignPatterns]]&lt;br /&gt;
[[Category:APIDesignPatterns:Creational]]&lt;/div&gt;</summary>
		<author><name>JaroslavTulach</name></author>	</entry>

	</feed>