View Javadoc

    1   package net.sourceforge.pmd.rules.basic;
    2
    3   import net.sourceforge.pmd.AbstractRule;
    4   import net.sourceforge.pmd.ast.ASTAllocationExpression;
    5   import net.sourceforge.pmd.ast.ASTArrayDimsAndInits;
    6   import net.sourceforge.pmd.ast.ASTBooleanLiteral;
    7   import net.sourceforge.pmd.ast.ASTClassOrInterfaceType;
    8   import net.sourceforge.pmd.ast.ASTLiteral;
    9   import net.sourceforge.pmd.ast.ASTName;
    10  import net.sourceforge.pmd.ast.ASTPrimaryExpression;
    11  import net.sourceforge.pmd.ast.ASTPrimaryPrefix;
    12  import net.sourceforge.pmd.ast.ASTPrimarySuffix;
    13
    14  /***
    15   * Avoid instantiating Boolean objects; you can reference Boolean.TRUE,
    16   * Boolean.FALSE, or call Boolean.valueOf() instead.
    17   *
    18   * <pre>
    19   *  public class Foo {
    20   *       Boolean bar = new Boolean("true");    // just do a Boolean
    21   *       bar = Boolean.TRUE;                   //ok
    22   *       Boolean buz = Boolean.valueOf(false); // just do a Boolean buz = Boolean.FALSE;
    23   *  }
    24   * </pre>
    25   */
    26  public class BooleanInstantiation extends AbstractRule {
    27
    28      public Object visit(ASTAllocationExpression node, Object data) {
    29
    30          if (node.findChildrenOfType(ASTArrayDimsAndInits.class).size() > 0) {
    31              return super.visit(node, data);
    32          }
    33          String typeName = ((ASTClassOrInterfaceType) node.jjtGetChild(0)).getImage();
    34          if ("Boolean".equals(typeName) || "java.lang.Boolean".equals(typeName)) {
    35              super.addViolation(data, node);
    36              return data;
    37          }
    38          return super.visit(node, data);
    39      }
    40
    41      public Object visit(ASTPrimaryPrefix node, Object data) {
    42
    43          if (node.jjtGetNumChildren() == 0 || !node.jjtGetChild(0).getClass().equals(ASTName.class)) {
    44              return super.visit(node, data);
    45          }
    46
    47          if ("Boolean.valueOf".equals(((ASTName) node.jjtGetChild(0)).getImage())
    48                  || "java.lang.Boolean.valueOf".equals(((ASTName) node.jjtGetChild(0)).getImage())) {
    49              ASTPrimaryExpression parent = (ASTPrimaryExpression) node.jjtGetParent();
    50              ASTPrimarySuffix suffix = (ASTPrimarySuffix) parent.getFirstChildOfType(ASTPrimarySuffix.class);
    51              if (suffix == null) {
    52                  return super.visit(node, data);
    53              }
    54              ASTPrimaryPrefix prefix = (ASTPrimaryPrefix) suffix.getFirstChildOfType(ASTPrimaryPrefix.class);
    55              if (prefix == null) {
    56                  return super.visit(node, data);
    57              }
    58
    59              if (prefix.getFirstChildOfType(ASTBooleanLiteral.class) != null) {
    60                  super.addViolation(data, node);
    61                  return data;
    62              }
    63              ASTLiteral literal = (ASTLiteral) prefix.getFirstChildOfType(ASTLiteral.class);
    64              if (literal != null && ("\"true\"".equals(literal.getImage()) || "\"false\"".equals(literal.getImage()))) {
    65                  super.addViolation(data, node);
    66                  return data;
    67              }
    68          }
    69          return super.visit(node, data);
    70      }
    71  }