[8] Review request for 8007716 Add FunctionalInterface annotation to swing interfaces

Paul Sandoz paul.sandoz at oracle.com
Mon Aug 26 02:06:08 PDT 2013


On Aug 23, 2013, at 1:36 PM, Alexander Scherbatiy <alexandr.scherbatiy at oracle.com> wrote:

> 
> Hello,
> 
> Could you review the fix:
>   bug: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8007716
>   webrev: http://cr.openjdk.java.net/~alexsch/8007716/webrev.00
> 
>   There is the suggested functional interface candidates list in the 
> issue description.
>   I selected only listeners and Acive/Lazy values.
> 
>   However, I am not sure that listeners are good candidates for the 
> functional interface annotation
>   because there will be mix in the code that MouseWheelListener can be 
> used as functional interface and MouseMotionListener not.
> 

I suspect many implementations of these interfaces are likely to hold state and/or have side-effects. In that respect they are like java.util.function.Consumer:

/**
 * Represents an operation that accepts a single input argument and returns no
 * result. Unlike most other functional interfaces, {@code Consumer} is expected
 * to operate via side-effects.
 *
 * <p>This is a <a href="package-summary.html">functional interface</a>
 * whose functional method is {@link #accept(Object)}.
 *
 * @param <T> the type of the input to the operation
 *
 * @since 1.8
 */
@FunctionalInterface
public interface Consumer<T> {

My view is if it looks and quacks like a functional interface stick a @FunctionaInterface on it, regardless of whether other related interfaces cannot, such as MouseMotionListener since it has two abstract methods. So in general i think the listeners are a good category.

I tend to agree with your categorisation below, although i am not very familiar with Swing, and of course that does not mean lambda expressions or method references cannot be used with non-annotated interfaces.

Paul.

> ------------------------------
> The FunctionalInterface annotation has been added for the following 
> interfaces in the fix:
> 
>   jdk/src/share/classes/javax/swing/event/ChangeListener.java:36: Note: 
> Candidate functional interface
>   public interface ChangeListener extends EventListener {
> 
>   jdk/src/share/classes/javax/swing/event/HyperlinkListener.java:35: 
> Note: Candidate functional interface
>   public interface HyperlinkListener extends EventListener {
> 
>   jdk/src/share/classes/javax/swing/event/RowSorterListener.java:34: 
> Note: Candidate functional interface
>   public interface RowSorterListener extends java.util.EventListener {
> 
>   jdk/src/share/classes/javax/swing/event/CaretListener.java:36: Note: 
> Candidate functional interface
>   public interface CaretListener extends EventListener {
>        ^
> jdk/src/share/classes/javax/swing/event/ListSelectionListener.java:41: 
> Note: Candidate functional interface
>   public interface ListSelectionListener extends EventListener
>        ^
> jdk/src/share/classes/javax/swing/event/UndoableEditListener.java:37: 
> Note: Candidate functional interface
>   public interface UndoableEditListener extends java.util.EventListener {
>        ^
> jdk/src/share/classes/javax/swing/event/TableModelListener.java:38: 
> Note: Candidate functional interface
>   public interface TableModelListener extends java.util.EventListener
>        ^
> jdk/src/share/classes/javax/swing/event/TreeSelectionListener.java:43: 
> Note: Candidate functional interface
>   public interface TreeSelectionListener extends EventListener
> 
>   jdk/src/share/classes/javax/swing/text/ViewFactory.java:36: Note: 
> Candidate functional interface
>   public interface ViewFactory {
> 
>   jdk/src/share/classes/javax/swing/UIDefaults.java:951: Note: 
> Candidate functional interface
>   public interface LazyValue {
> 
>   jdk/src/share/classes/javax/swing/UIDefaults.java:984: Note: 
> Candidate functional interface
>   public interface ActiveValue {
> 
> ------------------------------
> The FunctionalInterface annotation has not been added for the following 
> interfaces in the fix
> because they mostly designed for the UI components painting rather to 
> use as single action or function calculation:
> 
>   jdk/src/share/classes/javax/swing/tree/TreeCellRenderer.java:42: 
> Note: Candidate functional interface
>   public interface TreeCellRenderer {
> 
>   jdk/src/share/classes/javax/swing/tree/RowMapper.java:36: Note: 
> Candidate functional interface
>   public interface RowMapper
> 
>   jdk/src/share/classes/javax/swing/table/TableCellRenderer.java:38: 
> Note: Candidate functional interface
>   public interface TableCellRenderer {
> 
>   jdk/src/share/classes/javax/swing/ListCellRenderer.java:89: Note: 
> Candidate functional interface
>   public interface ListCellRenderer<E>
> 
>   jdk/src/share/classes/javax/swing/text/TabExpander.java:34: Note: 
> Candidate functional interface
>   public interface TabExpander {
> 
>   jdk/src/share/classes/javax/swing/text/Position.java:49: Note: 
> Candidate functional interface
>   public interface Position {
> 
>   jdk/src/share/classes/javax/swing/text/Highlighter.java:112: Note: 
> Candidate functional interface
>     public interface HighlightPainter {
> 
>   jdk/src/share/classes/javax/swing/Painter.java:63: Note: Candidate 
> functional interface
>   public interface Painter<T> {
> 
>   jdk/src/share/classes/javax/swing/JComboBox.java:1484: Note: 
> Candidate functional interface
>   public interface KeySelectionManager {
> 
> ------------------------------
> The FunctionalInterface annotation has not been added for the following 
> interfaces in the fix
> because they are not public and so are not part of the public API:
> 
>   jdk/src/share/classes/javax/swing/TransferHandler.java:128: Note: 
> Candidate functional interface
>     interface HasGetTransferHandler {
> 
>   jdk/src/share/classes/javax/swing/text/html/CSSBorder.java:257: Note: 
> Candidate functional interface
>     interface BorderPainter {
>     ^
>   jdk/src/share/classes/javax/swing/text/html/Map.java:234: Note: 
> Candidate functional interface
>     interface RegionContainment {
> 
> jdk/src/share/classes/javax/swing/plaf/basic/DragRecognitionSupport.java:52: 
> Note: Candidate functional interface
>   class DragRecognitionSupport {
>     public static interface BeforeDrag {
> 
> 
> Thanks,
> Alexandr.
> 
> 



More information about the lambda-dev mailing list