<AWT Dev> [9] Review request for 8133453 Remove AWTKeyStroke.registerSubclass(Class) method
Alexander Zvegintsev
alexander.zvegintsev at oracle.com
Tue Sep 1 15:15:49 UTC 2015
+1
--
Thanks,
Alexander.
On 01.09.2015 16:39, Sergey Bylokhov wrote:
> Looks fine to me.
>
> On 01.09.15 13:49, Alexander Scherbatiy wrote:
>>
>> Hello,
>>
>> Could you review the fix:
>> bug: https://bugs.openjdk.java.net/browse/JDK-8133453
>> webrev: http://cr.openjdk.java.net/~alexsch/8133453/webrev.00
>>
>> The class KeyStroke has been added to the javax.swing package first
>> and then copied to the java.awt.AWTKeyStroke class.
>> Most of KeyStroke class methods looks like registering KeyStroke
>> class and call to the parent AWTKeyStroke method.
>>
>> AWTKeyStroke class is intended to contain keyChar, keyCode,
>> modifiers, and keyRelease flag and it seems
>> there are no reasons that this class can be subclassed.
>>
>> The suggestion is to remove the AWTKeyStroke.registerSubclass(Class)
>> method.
>>
>> The AWTKeyStroke.registerSubclass(Class) method can be deprecated so
>> only AWTKeyStroke and KeyStroke instances is allowed to be created.
>> The result will be that a user code get ClassCastException when
>> casting a returned key stroke to the custom key stroke which has the
>> similar effect.
>>
>> Removing the method in question leads to the binary compatibility
>> issue if someone uses the method. The following code will not work:
>> --------------------------
>> public class CustomKeyStroke extends AWTKeyStroke {
>>
>> public static void registerCustomKeyStroke() {
>> AWTKeyStroke.registerSubclass(CustomKeyStroke.class); //
>> removed method
>> }
>> }
>>
>> CustomKeyStroke.registerCustomKeyStroke();
>> AWTKeyStroke keyStroke = AWTKeyStroke.getAWTKeyStroke('C');
>> CustomKeyStroke customKeyStroke = (CustomKeyStroke) keyStroke; //
>> CustomKeyStroke instance is not returned
>> --------------------------
>>
>> The proposed workaround is to use a map between unique AWTKeyStroke
>> instances and custom key strokes:
>> --------------------------
>> private static HashMap<AWTKeyStroke, CustomKeyStroke> keyStrokeMap
>> = new HashMap<>();
>>
>> public static CustomKeyStroke getCustomKeyStroke(char c) {
>> AWTKeyStroke ketStroke = AWTKeyStroke.getAWTKeyStroke(c);
>> CustomKeyStroke customKeyStroke = keyStrokeMap.get(ketStroke);
>>
>> if (customKeyStroke == null) {
>> customKeyStroke = new CustomKeyStroke(ketStroke);
>> keyStrokeMap.put(ketStroke, customKeyStroke);
>> }
>>
>> return customKeyStroke;
>> }
>> --------------------------
>>
>>
>> AWT/Swing library only registers KeyStroke class
>> (AWTKeyStroke.registerSubclass(KeyStroke.class) calls in the KeyStroke
>> class)
>> and never registers AWTKeyStroke.class.
>> After the first KeyStroke.getKeyStroke(...) call in the keyStroke
>> class only KeyStroke instances will be created by AWTKeyStroke.
>>
>> The solution proposed in the fix is to always create
>> javax.swing.KeyStroke instances.
>>
>> Thanks,
>> Alexandr.
>>
>
>
More information about the awt-dev
mailing list