/*
 * Copyright 2012 The Netty Project
 *
 * The Netty Project licenses this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */
package io.netty.handler.timeout;

import static java.util.Objects.requireNonNull;

import io.netty.channel.Channel;

import io.netty.util.internal.StringUtil;

/**
 * A user event triggered by {@link IdleStateHandler} when a {@link Channel} is idle.
 */
public class IdleStateEvent {
    public static final IdleStateEvent FIRST_READER_IDLE_STATE_EVENT = new IdleStateEvent(IdleState.READER_IDLE, true);
    public static final IdleStateEvent READER_IDLE_STATE_EVENT = new IdleStateEvent(IdleState.READER_IDLE, false);
    public static final IdleStateEvent FIRST_WRITER_IDLE_STATE_EVENT = new IdleStateEvent(IdleState.WRITER_IDLE, true);
    public static final IdleStateEvent WRITER_IDLE_STATE_EVENT = new IdleStateEvent(IdleState.WRITER_IDLE, false);
    public static final IdleStateEvent FIRST_ALL_IDLE_STATE_EVENT = new IdleStateEvent(IdleState.ALL_IDLE, true);
    public static final IdleStateEvent ALL_IDLE_STATE_EVENT = new IdleStateEvent(IdleState.ALL_IDLE, false);

    private final IdleState state;
    private final boolean first;
    private String strVal;

    /**
     * Constructor for sub-classes.
     *
     * @param state the {@link IdleStateEvent} which triggered the event.
     * @param first {@code true} if its the first idle event for the {@link IdleStateEvent}.
     */
    protected IdleStateEvent(IdleState state, boolean first) {
        this.state = requireNonNull(state, "state");
        this.first = first;
    }

    /**
     * Returns the idle state.
     */
    public IdleState state() {
        return state;
    }

    /**
     * Returns {@code true} if this was the first event for the {@link IdleState}
     */
    public boolean isFirst() {
        return first;
    }

    @Override
    public String toString() {
        if (strVal == null) {
            strVal = StringUtil.simpleClassName(this) + "(" + state + (first ? ", first" : "") + ')';
        }
        return strVal;
    }
}

@@ -975,37 +975,56 @@
 LE_STATE_EVENT =
- new 
+%0A            new Default
 IdleStateEvent(I
@@ -1108,37 +1108,56 @@
 LE_STATE_EVENT =
- new 
+%0A            new Default
 IdleStateEvent(I
@@ -1248,37 +1248,56 @@
 LE_STATE_EVENT =
- new 
+%0A            new Default
 IdleStateEvent(I
@@ -1381,37 +1381,56 @@
 LE_STATE_EVENT =
- new 
+%0A            new Default
 IdleStateEvent(I
@@ -1518,37 +1518,56 @@
 LE_STATE_EVENT =
- new 
+%0A            new Default
 IdleStateEvent(I
@@ -1653,21 +1653,40 @@
 _EVENT =
- new 
+%0A            new Default
 IdleStat
@@ -1792,35 +1792,8 @@
 rst;
-%0A    private String strVal;
 %0A%0A  
@@ -2489,164 +2489,526 @@
     
-if (strVal == null) %7B
+return StringUtil.simpleClassName(this) + '(' + state + (first ? %22, first%22 : %22%22) + ')';
 %0A    
+%7D%0A%0A
     
-    strV
+private static final class DefaultIdleStateEvent extends IdleStateEvent %7B%0A        private fin
 al
- =
  String
-Util.simpleClassName(this) + %22(%22 + state + (first ? %22, first%22 : %22%22) + ')';%0A        %7D%0A        return strVal;
+ representation;%0A%0A        DefaultIdleStateEvent(IdleState state, boolean first) %7B%0A            super(state, first);%0A            this.representation = %22IdleStateEvent(%22 + state + (first ? %22, first%22 : %22%22) + ')';%0A        %7D%0A%0A        @Override%0A        public String toString() %7B%0A            return representation;%0A        %7D
 %0A   

Make only default IdleStateEvents cached string representation (#9705)