<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - Grimly</title>
		<link>https://www.developpez.net/forums/blogs/601356-grimly/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Fri, 03 Apr 2026 22:29:25 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - Grimly</title>
			<link>https://www.developpez.net/forums/blogs/601356-grimly/</link>
		</image>
		<item>
			<title><![CDATA[Le type de retour "This" en Java]]></title>
			<link>https://www.developpez.net/forums/blogs/601356-grimly/b879/type-retour-this-java/</link>
			<pubDate>Thu, 12 Nov 2015 16:51:27 GMT</pubDate>
			<description>Bonjour, 
 
Pendant certains...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour,<br />
<br />
Pendant certains de mes développements en Java j'ai bien souvent pesté contre l'api java.nio et ses classes Buffer qui ne permettent jamais complètement un chaînage des commandes (ce qui est proposé reste très intéressant néanmoins).<br />
J'ai tenté pas mal de fois de contourner ce problème jusqu'à trouver une astuce avec les types génériques.<br />
<br />
Je vais décrire mon raisonnement ci-dessous avec une classe &quot;Buffer&quot; et une méthode &quot;position&quot; comme ce que propose <a href="http://docs.oracle.com/javase/8/docs/api/java/nio/Buffer.html" target="_blank">java.nio.Buffer</a><br />
<br />
La première étape est de choisir un nom pour le type générique. On prendra ici &quot;This&quot;.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> Buffer&lt;This&gt; <span class="br0">&#123;</span>
    <span style="color: #0000ff;">public</span> This position<span class="br0">&#40;</span><span style="color: #0000ff;">int</span> position<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">null</span>; <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><br />
Ensuite il faut définir ce This de façon à ce que le chaînage puisse se réaliser. On le fera alors étendre la classe Buffer elle même.<br />
Afin de terminer la définition, le type This est réutilisé dans la classe parent de This.<br />
On pourra alors terminer l'implémentation avec un retour de &quot;this&quot; au lieu de &quot;null&quot;.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> Buffer&lt;This <span style="color: #0000ff;">extends</span> Buffer&lt;This&gt;&gt; <span class="br0">&#123;</span>
    <span style="color: #0000ff;">public</span> This position<span class="br0">&#40;</span><span style="color: #0000ff;">int</span> position<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>; <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><br />
Dès lors on peut très facilement chaîner nos appels de méthodes.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">Buffer buffer = <span style="color: #0000ff;">new</span> Buffer<span class="br0">&#40;</span><span class="br0">&#41;</span>;
buffer.position<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>.position<span class="br0">&#40;</span><span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
Le problème maintenant est sur la déclaration du composant générique à l'utilisation.<br />
Ici, un IDE consciencieux vous dira que le type générique n'est pas défini et qu'il faut le préciser.<br />
<br />
Le type Object ne réponds pas au critère car il n'hérite pas de Buffer.<br />
Le type Buffer est correct (Buffer&lt;Buffer&gt;) mais on retrouve exactement le même problème sur la suite de la définition<br />
En java le caractère &quot;?&quot; permet de définir un type générique non défini. Ici il convient parfaitement car bien que nous ne précisons pas de type précis, le compilateur sais au sein de la classe Buffer que &quot;This&quot; est au moins un type &quot;Buffer&lt;This&gt;&quot;.<br />
<br />
Le code client sera alors le suivant :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">Buffer&lt;?&gt; buffer = <span style="color: #0000ff;">new</span> Buffer&lt;&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;
buffer.position<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>.position<span class="br0">&#40;</span><span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
Passons maintenant à l'héritage.<br />
Imaginons un type ByteBuffer qui étends Buffer avec une nouvelle méthode &quot;put&quot;.<br />
L'astuce ici est de préciser plus finement le paramètre This pour maintenant étendre ByteBuffer et non Buffer.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> ByteBuffer&lt;This <span style="color: #0000ff;">extends</span> ByteBuffer&lt;This&gt;&gt; <span style="color: #0000ff;">extends</span> Buffer&lt;This&gt; <span class="br0">&#123;</span>
    <span style="color: #0000ff;">public</span> This put<span class="br0">&#40;</span><span style="color: #0000ff;">byte</span> b<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>; <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><br />
Le code client ne change pas tellement si on garde le même type de départ, à savoir Buffer :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">Buffer&lt;?&gt; buffer = <span style="color: #0000ff;">new</span> ByteBuffer&lt;&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;
buffer.position<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>.position<span class="br0">&#40;</span><span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>On remarquera que comme nous avons déclaré la variable &quot;buffer&quot; comme étant un &quot;Buffer&quot;, nous n'avons pas accès à la méthode &quot;put&quot; et nous gardons la vision d'un objet Buffer.<br />
<br />
Lors de l'utilisation du type ByteBuffer, nous pouvons chaîner les opérations de la classe ByteBuffer avec les opérations de la classe Buffer comme suit :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">ByteBuffer&lt;?&gt; buffer = <span style="color: #0000ff;">new</span> ByteBuffer&lt;&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;
buffer.position<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>.put<span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #0000ff;">byte</span><span class="br0">&#41;</span><span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>.position<span class="br0">&#40;</span><span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>.put<span class="br0">&#40;</span><span class="br0">&#40;</span><span style="color: #0000ff;">byte</span><span class="br0">&#41;</span><span style="color: #cc66cc;">250</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
Imaginons maintenant un nouveau type de Buffer qui prends en charge n'importe quel type, paramétré, d'élément, ObjectBuffer.<br />
Sa déclaration sera fortement semblable que pour ByteBuffer :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> ObjectBuffer&lt;Element, This <span style="color: #0000ff;">extends</span> ObjectBuffer&lt;Element, This&gt;&gt; <span style="color: #0000ff;">extends</span> Buffer&lt;This&gt; <span class="br0">&#123;</span>
    <span style="color: #0000ff;">public</span> This put<span class="br0">&#40;</span>Element e<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>; <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div>Il est à noter ici que les autres types paramétrés sont répétés systématiquement. C'est ici que se trouve le coût de notre &quot;This&quot; dans la déclaration de notre classe.<br />
<br />
Le code client devra à nouveau omettre le type &quot;This&quot; qu'il ne nous intéresse pas de définir :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">ObjectBuffer&lt;String, ?&gt; buffer = <span style="color: #0000ff;">new</span> ObjectBuffer&lt;&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;
buffer.position<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>.put<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;zero&quot;</span><span class="br0">&#41;</span>.position<span class="br0">&#40;</span><span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>.put<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;cinq&quot;</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
Cette notation permet aussi d'effectuer du prototypage au lieu d'un objet mutable. On peut imaginer de même qu'au lieu de l'instruction &quot;return this;&quot;, l'objet retourné soit une copie.<br />
<br />
<br />
<br />
Beaucoup de réflexion pour ce sucre syntaxique. Mais ce n'est pas la première fois que je relevais ce problème sur l'API java.nio et je pense que d'autres l'ont aussi noté.</blockquote>

]]></content:encoded>
			<dc:creator>Grimly</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/601356-grimly/b879/type-retour-this-java/</guid>
		</item>
	</channel>
</rss>
