View Javadoc
1   package org.djutils.event;
2   
3   import java.io.Serializable;
4   
5   /**
6    * The EventType is a masker used for the subscription to asynchronous events. Eventtypes are used by EventProducers to show
7    * which events they potentially fire. EventTypes should be defined as static final fields. In order to prevent name clashes for
8    * the EventType, the full name of the class from which the EventType was defined (usually in the <clinit>) is added to
9    * the equals() and hashCode() methods of the EventType. In that way, EventTypes that are the same will be unique, but
10   * EventTypes with just the same name but defined in different classes will be different. <br>
11   * <br>
12   * Note: the reason why this is important is because <b>remote events</b> that use EventTypes can have <i>multiple versions</i>
13   * of the same public static final EventType: one the is defined in the client, and one that is defined via the network. These
14   * will have <i>different addresses in memory</i> but they share the same class and name info, so equals() will yield true.
15   * <p>
16   * Copyright (c) 2002-2020 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See
17   * for project information <a href="https://djutils.org" target="_blank"> https://djutils.org</a>. The DJUTILS project is
18   * distributed under a three-clause BSD-style license, which can be found at
19   * <a href="https://djutils.org/docs/license.html" target="_blank"> https://djutils.org/docs/license.html</a>. This class was
20   * originally part of the DSOL project, see <a href="https://simulation.tudelft.nl/dsol/manual" target="_blank">
21   * https://simulation.tudelft.nl/dsol/manual</a>.
22   * </p>
23   * @author <a href="https://www.linkedin.com/in/peterhmjacobs">Peter Jacobs </a>
24   * @author <a href="https://www.tudelft.nl/averbraeck">Alexander Verbraeck</a>
25   */
26  public final class EventType implements Serializable
27  {
28      /** The default serial version UID for serializable classes. */
29      private static final long serialVersionUID = 20140830L;
30  
31      /** The name of the eventType. */
32      private final String name;
33  
34      /**
35       * The class name from which the event type construction was called; together with the event name this should lead to a
36       * unique hash, even when the same name is used in different classes.
37       */
38      private final String definingClassName;
39  
40      /**
41       * Construct a new EventType.
42       * @param name String; the name of this eventType. Two values are not appreciated: null and the empty string.
43       */
44      public EventType(final String name)
45      {
46          if (name == null || name.equals(""))
47          {
48              throw new IllegalArgumentException("EventType name == null || EventType name == \"\"");
49          }
50          this.name = name;
51          StackTraceElement[] steArray = new Throwable().getStackTrace();
52          this.definingClassName = steArray[1].getClassName();
53      }
54  
55      /**
56       * Return the event type name.
57       * @return String; the event type name
58       */
59      public String getName()
60      {
61          return this.name;
62      }
63  
64      /** {@inheritDoc} */
65      @Override
66      public String toString()
67      {
68          return this.name;
69      }
70  
71      /** {@inheritDoc} */
72      @Override
73      public int hashCode()
74      {
75          final int prime = 31;
76          int result = 1;
77          result = prime * result + this.definingClassName.hashCode();
78          result = prime * result + this.name.hashCode();
79          return result;
80      }
81  
82      /** {@inheritDoc} */
83      @Override
84      @SuppressWarnings("checkstyle:needbraces")
85      public boolean equals(final Object obj)
86      {
87          if (this == obj)
88              return true;
89          if (obj == null)
90              return false;
91          if (getClass() != obj.getClass())
92              return false;
93          EventType/../../org/djutils/event/EventType.html#EventType">EventType other = (EventType) obj;
94          if (!this.name.equals(other.name))
95              return false;
96          if (!this.definingClassName.equals(other.definingClassName))
97              return false;
98          return true;
99      }
100 
101 }