sdedic commented on code in PR #4157:
URL: https://github.com/apache/netbeans/pull/4157#discussion_r883325457


##########
platform/openide.nodes/src/org/openide/nodes/PropertySupport.java:
##########
@@ -87,6 +92,162 @@ static <T> T cast(Class<T> c, Object o) {
         }
     }
 
+    /**
+     * Creates a "virtual" property where getter and setter are backed by the
+     * provided {@link Supplier} and {@link Consumer} functional interfaces.
+     * @param <T> the type of the property
+     * @param name the name of the property
+     * @param valueType the type of the property
+     * @param displayName the display name of the property, can be {@code 
null}.
+     * @param shortDescription the short description (used in tooltip) of the 
property, can be {@code null}.
+     * @param supplier the getter functional interface, can be {@code null} 
for write-only properties.
+     * @param consumer the setter functional interface, can be {@code null} 
for read-only properties.
+     *
+     * @since 7.62
+     * @return a {@link PropertySupport} instance where getter and setter are
+     *         backed by the provided functional interfaces.
+     */
+    public static <T> PropertySupport<T> readWrite(String name, Class<T> 
valueType, String displayName, String shortDescription, Supplier<T> supplier, 
Consumer<T> consumer) {
+        return new FunctionalProperty<>(name, valueType, displayName, 
shortDescription, supplier, consumer);
+    }
+
+    /**
+     * Creates a "virtual" property where getter and setter are backed by the
+     * provided {@link Supplier} and {@link Consumer} functional interfaces.
+     * @param <T> the type of the property
+     * @param name the name of the property
+     * @param valueType the type of the property
+     * @param displayName the display name of the property, can be {@code 
null}.
+     * @param supplier the getter functional interface, can be {@code null} 
for write-only properties.
+     * @param consumer the setter functional interface, can be {@code null} 
for read-only properties.
+     *
+     * @since 7.62
+     * @return a {@link PropertySupport} instance where getter and setter are
+     *         backed by the provided functional interfaces.
+     */
+    public static <T> PropertySupport<T> readWrite(String name, Class<T> 
valueType, String displayName, Supplier<T> supplier, Consumer<T> consumer) {

Review Comment:
   Not a review objection, rather a thought to consider.
   
   There are 3 overloads for each flavour (readOnly, readWrite) that serve 
rather as a convenience methods that do not require the caller to use `null` as 
argument (displayName, sdescription). Is that necessary ? I mean given that the 
result is `PropertySupport` = `Node.Property` = `FeatureDescriptor`, then 
anyone can call `setShortDescription` or `setDisplayName` afterwards (since 
it's in FeatureDescriptor). Or just pass `null` to the most-args factory method.
   The `null`-passing technique is used to make Functional propsupport readonly 
or  writeonly anyway.
   
   Another alternative, to make the construction fluent - and with an effect to 
other potential PropertySupport subclasses would be to add 
   `public final PropertySupport withShortDescription(String s) { 
setShortDescription(s); return this;}` and the same for display name ... number 
of characters typed is +- same with the current state, but can be configured in 
one expression.



##########
platform/openide.nodes/src/org/openide/nodes/PropertySupport.java:
##########
@@ -322,14 +485,13 @@ public void setValue(T val)
         * @return the property editor or <CODE>null</CODE> if there should not 
be
         *    any editor.
         */
+        @Override
         public PropertyEditor getPropertyEditor() {
             if (propertyEditorClass != null) {
                 try {
-                    return propertyEditorClass.newInstance();
-                } catch (InstantiationException ex) {
+                    return 
propertyEditorClass.getDeclaredConstructor().newInstance();
+                } catch (InstantiationException | IllegalAccessException | 
NoSuchMethodException | SecurityException | IllegalArgumentException | 
InvocationTargetException ex) {

Review Comment:
   some of them can be reduced to a `ReflectiveOperationException` ?



##########
platform/openide.nodes/src/org/openide/nodes/PropertySupport.java:
##########
@@ -360,6 +522,35 @@ public ReadWrite(String name, Class<T> type, String 
displayName, String shortDes
         }
     }
 
+    private static final class FunctionalProperty<T> extends 
PropertySupport<T> {
+        private final Supplier<T> supplier;
+        private final Consumer<T> consumer;
+
+        public FunctionalProperty(String name, Class<T> type, String 
displayName, String shortDescription, Supplier<T> supplier, Consumer<T> 
consumer) {
+            super(name, type, displayName, shortDescription, supplier != null, 
consumer != null);
+            this.supplier = supplier;
+            this.consumer = consumer;
+        }
+
+        @Override
+        public T getValue() throws IllegalAccessException, 
IllegalArgumentException, InvocationTargetException {

Review Comment:
   I guess there's no need to declare the exceptions, probably a leftover from 
a reflective op copypaste.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to