Class IllegalInstantiationCheck

  • All Implemented Interfaces:
    Configurable, Contextualizable

    public class IllegalInstantiationCheck
    extends AbstractCheck

    Checks for illegal instantiations where a factory method is preferred.

    Rationale: Depending on the project, for some classes it might be preferable to create instances through factory methods rather than calling the constructor.

    A simple example is the java.lang.Boolean class. For performance reasons, it is preferable to use the predefined constants TRUE and FALSE. Constructor invocations should be replaced by calls to Boolean.valueOf().

    Some extremely performance sensitive projects may require the use of factory methods for other classes as well, to enforce the usage of number caches or object pools.

    There is a limitation that it is currently not possible to specify array classes.

    • Property classes - Specify fully qualified class names that should not be instantiated. Type is java.lang.String[]. Default value is "".

    To configure the check:

     <module name="IllegalInstantiation"/>
     

    Example:

     public class MyTest {
       public class Boolean {
         boolean a;
    
         public Boolean (boolean a) { this.a = a; }
       }
    
       public void myTest (boolean a, int b) {
         Boolean c = new Boolean(a); // OK
         java.lang.Boolean d = new java.lang.Boolean(a); // OK
    
         Integer e = new Integer(b); // OK
         Integer f = Integer.valueOf(b); // OK
       }
     }
     

    To configure the check to find instantiations of java.lang.Boolean and java.lang.Integer:

     <module name="IllegalInstantiation">
       <property name="classes" value="java.lang.Boolean,
         java.lang.Integer"/>
     </module>
     

    Example:

     public class MyTest {
       public class Boolean {
         boolean a;
    
         public Boolean (boolean a) { this.a = a; }
       }
    
       public void myTest (boolean a, int b) {
         Boolean c = new Boolean(a); // OK
         java.lang.Boolean d = new java.lang.Boolean(a); // violation, instantiation of
                                                         // java.lang.Boolean should be avoided
    
         Integer e = new Integer(b); // violation, instantiation of
                                     // java.lang.Integer should be avoided
         Integer f = Integer.valueOf(b); // OK
       }
     }
     

    Finally, there is a limitation that it is currently not possible to specify array classes:

     <module name="IllegalInstantiation">
       <property name="classes" value="java.lang.Boolean[],
          Boolean[], java.lang.Integer[], Integer[]"/>
     </module>
     

    Example:

     public class MyTest {
       public void myTest () {
         Boolean[] newBoolArray = new Boolean[]{true,true,false}; // OK
         Integer[] newIntArray = new Integer[]{1,2,3}; // OK
       }
     }
     

    Parent is com.puppycrawl.tools.checkstyle.TreeWalker

    Violation Message Keys:

    • instantiation.avoid
    Since:
    3.0
    • Method Detail

      • getAcceptableTokens

        public int[] getAcceptableTokens()
        Description copied from class: AbstractCheck
        The configurable token set. Used to protect Checks against malicious users who specify an unacceptable token set in the configuration file. The default implementation returns the check's default tokens.
        Specified by:
        getAcceptableTokens in class AbstractCheck
        Returns:
        the token set this check is designed for.
        See Also:
        TokenTypes
      • beginTree

        public void beginTree​(DetailAST rootAST)
        Description copied from class: AbstractCheck
        Called before the starting to process a tree. Ideal place to initialize information that is to be collected whilst processing a tree.
        Overrides:
        beginTree in class AbstractCheck
        Parameters:
        rootAST - the root of the tree
      • finishTree

        public void finishTree​(DetailAST rootAST)
        Description copied from class: AbstractCheck
        Called after finished processing a tree. Ideal place to report on information collected whilst processing a tree.
        Overrides:
        finishTree in class AbstractCheck
        Parameters:
        rootAST - the root of the tree
      • processClassDef

        private void processClassDef​(DetailAST ast)
        Collects classes defined in the source file. Required to avoid false alarms for local vs. java.lang classes.
        Parameters:
        ast - the class def token.
      • processImport

        private void processImport​(DetailAST ast)
        Perform processing for an import token.
        Parameters:
        ast - the import token
      • processPackageDef

        private void processPackageDef​(DetailAST ast)
        Perform processing for an package token.
        Parameters:
        ast - the package token
      • postProcessLiteralNew

        private void postProcessLiteralNew​(DetailAST newTokenAst)
        Processes one of the collected "new" tokens when walking tree has finished.
        Parameters:
        newTokenAst - the "new" token.
      • getIllegalInstantiation

        private String getIllegalInstantiation​(String className)
        Checks illegal instantiations.
        Parameters:
        className - instantiated class, may or may not be qualified
        Returns:
        the fully qualified class name of className or null if instantiation of className is OK
      • checkImportStatements

        private String checkImportStatements​(String className)
        Check import statements.
        Parameters:
        className - name of the class
        Returns:
        value of illegal instantiated type
      • isSamePackage

        private boolean isSamePackage​(String className,
                                      int pkgNameLen,
                                      String illegal)
        Check that type is of the same package.
        Parameters:
        className - class name
        pkgNameLen - package name
        illegal - illegal value
        Returns:
        true if type of the same package
      • isStandardClass

        private boolean isStandardClass​(String className,
                                        String illegal)
        Is Standard Class.
        Parameters:
        className - class name
        illegal - illegal value
        Returns:
        true if type is standard
      • setClasses

        public void setClasses​(String... names)
        Setter to specify fully qualified class names that should not be instantiated.
        Parameters:
        names - class names