<AWT Dev> [9] Review Request: 8037485 Refactor java.awt.datatransfer to eliminate dependency on AWT

Peter Levart peter.levart at gmail.com
Fri Jul 25 06:41:34 UTC 2014


On 07/24/2014 01:22 PM, Petr Pchelko wrote:
> Thank you for the review.
> I’ve updated the fix:http://cr.openjdk.java.net/~pchelko/9/8037485/webrev.04/
>
> I’ve fixed all suggestions except one:
>> >Another optimization/simplification is possible. You could merge the DesktopDatatransferServiceHolder and default implementation into one class:
> No, I could not. The default implementation is a member of desktop module while DataFlavorUtil is a part of data transfer module.
>

Hi Petr,

Sorry, I haven't been clear/precise enough. I meant to say that you 
could merge the DesktopDatatransferServiceHolder class and the 
"fall-back" empty implementation into one class (instead of having 
DesktopDatatransferServiceHolder a separate class and "fall-back" 
implementation being anonymous inner class). You save one class and 
eliminate some boilerplate:

public class DataFlavorUtil {

     public static DesktopDatatransferService getDesktopService() {
         return DesktopDatatransferServiceImpl.INSTANCE;
     }

     private static final class DesktopDatatransferServiceImpl 
implements DesktopDatatransferService {
         static final DesktopDatatransferService INSTANCE;
         static {
             ServiceLoader<DesktopDatatransferService> loader =
                 ServiceLoader.load(DesktopDatatransferService.class, 
null);
             Iterator<DesktopDatatransferService> iterator = 
loader.iterator();
             if (iterator.hasNext()) {
                 INSTANCE = iterator.next();
             } else {
                 INSTANCE = new DesktopDatatransferServiceImpl();
             }
         }

                     /**
                      * System singleton FlavorTable.
                      * Only used if there is no desktop
                      * to provide an appropriate FlavorMap.
                      */
                     private volatile FlavorMap flavorMap;

                     @Override
                     public void invokeOnEventThread(Runnable r) {
                         r.run();
                     }

                     @Override
                     public String getDefaultUnicodeEncoding() {
                         return StandardCharsets.UTF_8.name();
                     }

                     @Override
                     public FlavorMap getFlavorMap(Supplier<FlavorMap> 
supplier) {
                         FlavorMap map = flavorMap;
                         if (map == null) {
                             synchronized (this) {
                                 map = flavorMap;
                                 if (map == null) {
                                     flavorMap = map = supplier.get();
                                 }
                             }
                         }
                         return map;
                     }

                     @Override
                     public boolean isDesktopPresent() {
                         return false;
                     }

                     @Override
                     public LinkedHashSet<DataFlavor> 
getPlatformMappingsForNative(String nat) {
                         return new LinkedHashSet<>();
                     }

                     @Override
                     public LinkedHashSet<String> 
getPlatformMappingsForFlavor(DataFlavor df) {
                         return new LinkedHashSet<>();
                     }

                     @Override
                     public void registerTextFlavorProperties(String 
nat, String charset, String eoln, String terminators) {
                         // Not needed if desktop module is absent
                     }
     }




...but it is good as is.

Regards, Peter



More information about the awt-dev mailing list