Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: com/puppycrawl/tools/checkstyle/checks/design/InterfaceIsTypeCheck.java


1   ////////////////////////////////////////////////////////////////////////////////
2   // checkstyle: Checks Java source code for adherence to a set of rules.
3   // Copyright (C) 2001-2003  Oliver Burn
4   //
5   // This library is free software; you can redistribute it and/or
6   // modify it under the terms of the GNU Lesser General Public
7   // License as published by the Free Software Foundation; either
8   // version 2.1 of the License, or (at your option) any later version.
9   //
10  // This library is distributed in the hope that it will be useful,
11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  // Lesser General Public License for more details.
14  //
15  // You should have received a copy of the GNU Lesser General Public
16  // License along with this library; if not, write to the Free Software
17  // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  ////////////////////////////////////////////////////////////////////////////////
19  package com.puppycrawl.tools.checkstyle.checks.design;
20  
21  import com.puppycrawl.tools.checkstyle.api.Check;
22  import com.puppycrawl.tools.checkstyle.api.TokenTypes;
23  import com.puppycrawl.tools.checkstyle.api.DetailAST;
24  
25  /**
26   * Implements Bloch, Effective Java, Item 17 -
27   * Use Interfaces only to define types.
28   *
29   * <p>
30   * An interface should describe a <em>type</em>, it is therefore
31   * inappropriate to define an interface that does not contain any methods
32   * but only constants.
33   * </p>
34   *
35   * <p>
36   * The check can be configured to also disallow marker interfaces like
37   * <code>java.io.Serializable</code>, that do not contain methods or
38   * constants at all.
39   * </p>
40   *
41   * @author lkuehne
42   * @version $Revision: 1.2 $
43   */
44  public final class InterfaceIsTypeCheck
45          extends Check
46  {
47      /** flag to control whether marker interfaces are allowed. */
48      private boolean mAllowMarkerInterfaces = true;
49  
50      /** @see Check */
51      public int[] getDefaultTokens()
52      {
53          return new int[] {TokenTypes.INTERFACE_DEF};
54      }
55  
56      /** @see Check */
57      public int[] getRequiredTokens()
58      {
59          return getDefaultTokens();
60      }
61  
62      /** @see Check */
63      public void visitToken(DetailAST aAST)
64      {
65          final DetailAST objBlock =
66                  aAST.findFirstToken(TokenTypes.OBJBLOCK);
67          final DetailAST methodDef =
68                  objBlock.findFirstToken(TokenTypes.METHOD_DEF);
69          final DetailAST variableDef =
70                  objBlock.findFirstToken(TokenTypes.VARIABLE_DEF);
71          boolean methodRequired =
72                  !mAllowMarkerInterfaces || variableDef != null;
73  
74          if (methodDef == null && methodRequired) {
75              log(aAST.getLineNo(), "interface.type");
76          }
77  
78      }
79  
80      /**
81       * Controls whether marker interfaces like Serializable are allowed.
82       * @param aFlag whether to allow marker interfaces or not
83       */
84      public void setAllowMarkerInterfaces(boolean aFlag)
85      {
86          mAllowMarkerInterfaces = aFlag;
87      }
88  }