Class DotName

  • All Implemented Interfaces:
    java.lang.Comparable<DotName>

    public final class DotName
    extends java.lang.Object
    implements java.lang.Comparable<DotName>
    A DotName represents a dot separated name, typically a Java package or a Java class. It has two possible variants. A simple wrapper based variant allows for fast construction (it simply wraps the specified name string). Whereas, a componentized variant represents one or more String components that, when combined with a dot character, assemble the full name. The intention of the componentized variant is that the String components can be reused to offer memory efficiency. This reuse is common in Java where packages and classes follow a tree structure.

    Both the simple and componentized variants are considered semantically equivalent if they refer to the same logical name. More specifically, the equals and hashCode methods return the same values for the same semantic name regardless of the variant used. Which variant to use when depends on the specific performance and overhead objectives of the specific use pattern.

    Simple names are cheap to construct (just an additional wrapper object), so are ideal for temporary use, like looking for an entry in a Map. Componentized names however require that they be split in advance, and so require some additional time to construct. However, the memory benefits of reusing component strings make them desirable when stored in a longer term area such as in a Java data structure.

    • Field Detail

      • JAVA_NAME

        static final DotName JAVA_NAME
      • JAVA_LANG_NAME

        static final DotName JAVA_LANG_NAME
      • JAVA_LANG_ANNOTATION_NAME

        static final DotName JAVA_LANG_ANNOTATION_NAME
      • OBJECT_NAME

        public static final DotName OBJECT_NAME
      • CLASS_NAME

        public static final DotName CLASS_NAME
      • ENUM_NAME

        public static final DotName ENUM_NAME
      • RECORD_NAME

        public static final DotName RECORD_NAME
      • STRING_NAME

        public static final DotName STRING_NAME
      • BOOLEAN_CLASS_NAME

        public static final DotName BOOLEAN_CLASS_NAME
      • BYTE_CLASS_NAME

        public static final DotName BYTE_CLASS_NAME
      • SHORT_CLASS_NAME

        public static final DotName SHORT_CLASS_NAME
      • INTEGER_CLASS_NAME

        public static final DotName INTEGER_CLASS_NAME
      • LONG_CLASS_NAME

        public static final DotName LONG_CLASS_NAME
      • FLOAT_CLASS_NAME

        public static final DotName FLOAT_CLASS_NAME
      • DOUBLE_CLASS_NAME

        public static final DotName DOUBLE_CLASS_NAME
      • CHARACTER_CLASS_NAME

        public static final DotName CHARACTER_CLASS_NAME
      • VOID_CLASS_NAME

        public static final DotName VOID_CLASS_NAME
      • INHERITED_NAME

        public static final DotName INHERITED_NAME
      • REPEATABLE_NAME

        public static final DotName REPEATABLE_NAME
      • RETENTION_NAME

        public static final DotName RETENTION_NAME
      • prefix

        private final DotName prefix
      • local

        private final java.lang.String local
      • hash

        private int hash
      • componentized

        private final boolean componentized
      • innerClass

        private final boolean innerClass
    • Constructor Detail

      • DotName

        DotName​(DotName prefix,
                java.lang.String local,
                boolean noDots,
                boolean innerClass)
    • Method Detail

      • createSimple

        public static DotName createSimple​(java.lang.String name)
        Constructs a simple DotName which stores the string in its entirety. This variant is ideal for temporary usage, such as looking up an entry in a Map or an index.
        Parameters:
        name - a fully qualified name (with dots); must not be null
        Returns:
        a simple DotName that wraps given name; never null
      • createSimple

        public static DotName createSimple​(java.lang.Class<?> clazz)
        Constructs a simple DotName which stores the name of given class in its entirety. This variant is ideal for temporary usage, such as looking up an entry in a Map or an index.

        This method is a shortcut for DotName.createSimple(clazz.getName()).

        Parameters:
        clazz - a class whose fully qualified name is returned; must not be null
        Returns:
        a simple DotName that wraps the name of given clazz; never null
      • createComponentized

        public static DotName createComponentized​(DotName prefix,
                                                  java.lang.String localName)
        Constructs a componentized DotName. Such DotName refers to a parent prefix (or null if there is no further prefix) in addition to a local name that has no dot separator. The fully qualified name this DotName represents is constructed by recursing all parent prefixes and joining all local names with the '.' character.
        Parameters:
        prefix - another DotName that is the portion of the final name to the left of localName; may be null if there is no prefix
        localName - the local portion of this name; must not be null and must not contain '.'
        Returns:
        a componentized DotName; never null
      • createComponentized

        public static DotName createComponentized​(DotName prefix,
                                                  java.lang.String localName,
                                                  boolean innerClass)
        Constructs a componentized DotName. Such DotName refers to a parent prefix (or null if there is no further prefix) in addition to a local name that has no dot separator. The fully qualified name this DotName represents is constructed by recursing all parent prefixes and joining all local names with the '.' character.
        Parameters:
        prefix - another DotName that is the portion of the final name to the left of localName; may be null if there is no prefix
        localName - the local portion of this name; must not be null and must not contain '.'
        innerClass - whether the localName is an inner class style name, which is joined to the prefix using '$' instead of '.'
        Returns:
        a componentized DotName; never null
      • prefix

        public DotName prefix()
        Returns the parent prefix for this DotName or null if there is none. Simple DotName variants never have a prefix.
        Returns:
        the parent prefix for this DotName; may be null
      • local

        public java.lang.String local()
        Returns the local portion of this DotName. In simple variants, the entire fully qualified string is returned. In componentized variants, just the rightmost portion not including a separator (either '.' or '$') is returned.

        Use withoutPackagePrefix() instead of this method if the desired value is the part of the string (including '$' signs if present) after the rightmost '.' delimiter.

        Returns:
        the local portion of this DotName; never null
      • withoutPackagePrefix

        public java.lang.String withoutPackagePrefix()
        Returns the portion of this DotName that does not contain a package prefix. In the case of an inner class syntax name, the '$' portion is included in the return value.
        Returns:
        the portion of the fully qualified name that does not include a package name
        Since:
        2.1.1
      • stripPackage

        private void stripPackage​(java.lang.StringBuilder builder)
      • packagePrefix

        public java.lang.String packagePrefix()
        Returns the package portion of this DotName.
        Returns:
        the package name or null if this DotName has no package prefix
        Since:
        2.4
      • packagePrefixName

        public DotName packagePrefixName()
        Returns the package portion of this DotName. This is a DotName-returning variant of packagePrefix().
        Returns:
        the package name or null if this DotName has no package prefix
        Since:
        3.0
      • isComponentized

        public boolean isComponentized()
        Returns whether this DotName is a componentized variant.
        Returns:
        true if it is componentized, false if it is a simple DotName
      • isInner

        public boolean isInner()
        Returns whether the local portion of a componentized DotName is separated by an inner class style delimiter ('$'). The result is undefined when this DotName is not componentized.

        This should not be used to test whether the name truly refers to an inner class, only that the dollar sign delimits the value. Java class names are allowed to contain '$' signs, so the local value could simply be a fragment of a class name, and not an actual inner class. The correct way to determine whether a name refers to an actual inner class is to look up a ClassInfo in the index and examine the nesting type like so:

         index.getClassByName(name).nestingType() != TOP_LEVEL;
         
        Returns:
        true if local is an inner class style delimited name, false otherwise
      • toString

        public java.lang.String toString()
        Returns the regular binary class name.
        Overrides:
        toString in class java.lang.Object
        Returns:
        the binary class name
      • toString

        public java.lang.String toString​(char delim)
        Returns the regular binary class name where delim is used as a package separator.
        Parameters:
        delim - the package separator; typically ., but may be e.g. / to construct a bytecode descriptor
        Returns:
        the binary class name with given character used as a package separator
      • buildString

        private void buildString​(char delim,
                                 java.lang.StringBuilder builder)
      • hashCode

        public int hashCode()
        Returns a hash code which is based on the semantic representation of this DotName.

        Whether a DotName is componentized has no impact on the calculated hash code. In other words, a componentized DotName and a simple DotName that represent the same fully qualified name have the same hash code.

        Overrides:
        hashCode in class java.lang.Object
        Returns:
        a hash code representing this object
        See Also:
        Object.hashCode()
      • equals

        public boolean equals​(java.lang.Object o)
        Compares a DotName to another DotName and returns true if they represent the same underlying semantic name. In other words, whether a name is componentized or simple has no bearing on the comparison.
        Overrides:
        equals in class java.lang.Object
        Parameters:
        o - the DotName object to compare to
        Returns:
        true if equal, false if not
        See Also:
        Object.equals(Object)
      • componentizedEquals

        private static boolean componentizedEquals​(DotName a,
                                                   DotName b)
      • compareTo

        public int compareTo​(DotName other)
        Compares a DotName to another DotName and returns whether this DotName is lesser than, greater than, or equal to the specified DotName. If this DotName is lesser, a negative value is returned. If greater, a positive value is returned. If equal, zero is returned.
        Specified by:
        compareTo in interface java.lang.Comparable<DotName>
        Parameters:
        other - the DotName to compare to
        Returns:
        a negative number if this is less than the specified object, a positive if greater, and zero if equal
        See Also:
        Comparable.compareTo(Object)
      • componentizedCompare

        private static int componentizedCompare​(DotName[] a,
                                                DotName[] b)