On Fri, 17 Jun 2022 06:27:12 GMT, liach <d...@openjdk.org> wrote:

>> Another approach would be to keep the parameter array and the boolean in a 
>> record, and mark the record field as stable, possibly like what's done in 
>> #6889. Keeping them in a record like:
>> 
>> record ParameterData(Parameter[] parameters, boolean real) {}
>> 
>> private transient @Stable ParameterData parameterData;
>> 
>> private ParameterData parameterData() {
>>     ParameterData data = parameterData;
>>     if (data != null)
>>         return data;
>>     // Create parameter data, cache and return
>> }
>> 
>> boolean hasRealParameterData() { return parameterData().real(); }
>> private Parameter[] privateGetParameters() { return 
>> parameterData().parameters(); }
>> 
>> 
>> This code should be more maintainable in the long run as well, with more 
>> straightforward concurrency and caching model.
>
> If my record approach is used, `hasRealParameterData()` and 
> `privateGetParameters()` should be manually inlined instead, for code 
> clarity. Alternatively, you can rename the components to like 
> `sharedArray`/`sharedParameters`, `isReal` to make the call sites like 
> `parameterData().sharedParameters().clone()` or `parameterData().isReal()` 
> more descriptive.
> 
> Currently, `hasRealParameterData` is only used in 
> `Executable::getAllGenericParameterTypes`, and `privateGetParameters` only in 
> `Executable::getParameters` (except the unintuitive usage to initialize the 
> parameter data), so the impact of such a refactor and inline would be small.

@liach Good point, done!

-------------

PR: https://git.openjdk.org/jdk/pull/9143

Reply via email to