<div dir="ltr">Hi Davor<div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>Thank you for your reply</div><div><br></div><div>Indeed, I had a thought about doing such a thing</div><div><br></div><div>But with this solution, involving the direct usage of a Carrier, a trouble would arise :</div><div><br></div><div>What if I only had to manage a single optional ACCEPT_LANGUAGE scope value ?</div><div><br></div><div>I wouldn't have other choice to either write a cumbersome code on the caller side :</div><div><br></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><span style="color:rgb(80,0,80);font-family:monospace">if( acceptLanguage == null ) {</span></div><div><span style="font-family:monospace"> ScopedValue</span></div><div><span style="font-family:monospace"> .where(</span><span style="font-family:monospace"> ACCEPT_LANGUAGE, acceptLanguage )</span></div><div><span style="font-family:monospace"> .call( MyClass::</span><span style="font-family:monospace">myStaticCallableMethod );</span></div><div><span style="font-family:monospace">} else {</span></div><span style="font-family:monospace"> MyClass.</span><span style="font-family:monospace">myStaticCallableMethod();</span><div><span style="font-family:monospace">}</span></div></blockquote></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><br></div><div>or to write something more straightforward :</div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><br></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><span style="font-family:monospace"> ScopedValue</span></div><div><span style="font-family:monospace"> .where(</span><span style="font-family:monospace"> ACCEPT_LANGUAGE, acceptLanguage ) // null binding is allowed here</span></div><div><span style="font-family:monospace"> .call( MyClass::</span><span style="font-family:monospace">myStaticCallableMethod );</span></div></div></blockquote></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><br></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px">... but in that later case, it would rule out the use of .isBound() or the .orElse() method on the callee side :<br><br></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><span style="font-family:monospace">private String myStaticCallableMethod() {<br></span><span style="font-family:monospace"> final Local localToUse = ACCEPT_LANGUAGE.get() == null<br></span><span style="font-family:monospace"> ? </span><span style="font-family:monospace">A_</span><span style="font-family:monospace">DEFAULT_LOCAL</span><span style="font-family:monospace"><br> : </span><span style="font-family:monospace">ACCEPT_LANGUAGE.get();<br></span></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><span style="font-family:monospace"> ...<br></span><span style="font-family:monospace">}</span></blockquote></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><br></div></blockquote></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>I feel like this is because there is no possibility to get an "emtpy" carrier from the ScopedValue API, but on the other hand, I guess it's a conception decision that has been made on purpose, else it would have enabled writing useless code such as :</div><div><br></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><span style="font-family:monospace">ScopedValue</span></div></blockquote></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><span style="font-family:monospace"> .getEmptyCarrier()</span></div></blockquote></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><span style="font-family:monospace"> .call( </span><span style="font-family:monospace">MyClass::</span><span style="font-family:monospace">myStaticCallableMethod </span><span style="font-family:monospace">);</span></div></blockquote></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><br></div><div>best regards</div></blockquote><div><br></div><div>Benoit</div></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">Le mer. 30 juil. 2025 à 23:31, Davor Hrg <<a href="mailto:hrgdavor@gmail.com">hrgdavor@gmail.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I personally would try this variant,<div><br></div><div><font face="monospace">Carrier carrier = ScopedValue.where( USER_ID, uid );<br> if( acceptLanguage == null ) {<br> carrier = carrier.where( ACCEPT_LANGUAGE, acceptLanguage );<br> }<br>carrier.call( MyClass::myStaticCallableMethod );</font><br></div><div><font face="monospace"><br></font></div><div><font face="monospace">br,</font></div><div><font face="monospace">Davor Hrg</font></div><div><font face="monospace"><br></font></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Jul 30, 2025 at 8:18 PM Benoit LEFEVRE -CAMPUS- <<a href="mailto:benoit.lefevre@decathlon.com" target="_blank">benoit.lefevre@decathlon.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Hello</div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>After using the ScopedValue for a few days, I'm wondering if there is a better way to conditionally bind a value than doing the following :<br></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><br><font face="monospace">public static final ScopedValue< Locale > ACCEPT_LANGUAGE = ScopedValue.newInstance();<br> public static final ScopedValue< String > USER_ID = ScopedValue.newInstance();<br><br>final Locale acceptLanguage = getAcceptLanguageFromHeader( httpRequest );</font></blockquote></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><font face="monospace"><br> if( acceptLanguage == null ) {<br> ScopedValue<br> .where( USER_ID, uid )<br> .call( MyClass::myStaticCallableMethod );<br> } else {<br> ScopedValue<br> .where( USER_ID, uid )<br> .where( ACCEPT_LANGUAGE, acceptLanguage )<br> .call( MyClass::myStaticCallableMethod );<br> }<br></font></blockquote></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><br></div></blockquote></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>The point for me of doing so, instead of simply setting a null acceptLanguage, is to have a more readable code afterward :<br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><br></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><span style="font-family:monospace">private String myStaticCallableMethod() {</span><br><span style="font-family:monospace"> final Local localToUse = ACCEPT_LANGUAGE.orElse( A_</span><span style="font-family:monospace">DEFAULT_LOCAL</span><span style="font-family:monospace"> );</span></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><br><span style="font-family:monospace"> ...</span><br><font face="monospace">}</font></blockquote></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><br></blockquote></div>What is your advise about it ?<br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote></div></blockquote><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">Best regards<br><br></blockquote></div><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature"><div dir="ltr">Benoit Lefèvre</div></div></div>
</blockquote></div>
</blockquote></div><div><br clear="all"></div><div><br></div><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature"><div dir="ltr">Benoit Lefèvre</div></div>