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  }