View Javadoc
1   /*
2   EqualsAvoidNull
3   ignoreEqualsIgnoreCase = (default)false
4   
5   
6   */
7   
8   package com.puppycrawl.tools.checkstyle.checks.coding.equalsavoidnull;
9   import java.util.Map;
10  public class InputEqualsAvoidNull {
11  
12      public boolean equals(Object o) {
13      return false;
14      }
15      // another comment
16      /**
17       * methods that should get flagged
18       * @return
19       */
20      public void flagForEquals() {
21  
22          Object o = new Object();
23          String s = "pizza";
24  
25          o.equals("hot pizza")/*comment test*/;
26  
27          o.equals(s = "cold pizza");
28  
29          o.equals(((s = "cold pizza")));
30  
31          o.equals("cheese" + "ham" + "sauce");
32  
33          o.equals(("cheese" + "ham") + "sauce");
34  
35          o.equals((("cheese" + "ham")) + "sauce");
36      }
37  
38      /**
39       * methods that should get flagged
40       */
41      public void flagForEqualsIgnoreCase() {
42          String s = "pizza";
43  
44          s.equalsIgnoreCase("hot pizza"); // violation 'left .* of .* equalsIgnoreCase'
45  
46          s.equalsIgnoreCase(s = "cold pizza"); // violation 'left .* of .* equalsIgnoreCase'
47  
48          s.equalsIgnoreCase(((s = "cold pizza"))); // violation 'left .* of .* equalsIgnoreCase'
49  
50          s.equalsIgnoreCase("cheese"+"ham"+"sauce");// violation 'left.*of.*equalsIgnoreCase'
51  
52          s.equalsIgnoreCase(("cheese"+"ham")+"sauce");// violation 'left.*of.*equalsIgnoreCase'
53  
54          s.equalsIgnoreCase((("cheese"+"ham"))+"sauce");// violation 'left.*of.*equalsIgnoreCase'
55      }
56  
57      /**
58       * methods that should get flagged
59       */
60      public void flagForBoth() {
61          Object o = new Object();
62          String s = "pizza";
63  
64          o.equals("hot pizza");
65  
66          o.equals(s = "cold pizza");
67  
68          o.equals(((s = "cold pizza")));
69  
70          o.equals("cheese" + "ham" + "sauce");
71  
72          o.equals(("cheese" + "ham") + "sauce");
73  
74          o.equals((("cheese" + "ham")) + "sauce");
75  
76          s.equalsIgnoreCase("hot pizza");// violation 'left.*of.*equalsIgnoreCase'
77  
78          s.equalsIgnoreCase(s = "cold pizza");// violation 'left.*of.*equalsIgnoreCase'
79  
80          s.equalsIgnoreCase(((s = "cold pizza")));// violation 'left.*of.*equalsIgnoreCase'
81  
82          s.equalsIgnoreCase("cheese"+"ham"+"sauce");// violation 'left.*of.*equalsIgnoreCase'
83  
84          s.equalsIgnoreCase(("cheese"+"ham")+"sauce");// violation 'left.*of.*equalsIgnoreCase'
85  
86          s.equalsIgnoreCase((("cheese"+"ham"))+"sauce");// violation 'left.*of.*equalsIgnoreCase'
87      }
88  
89  
90      /**
91       * methods that should not get flagged
92       *
93       * @return
94       */
95      public void noFlagForEquals() {
96          Object o = new Object();
97          String s = "peperoni";
98  
99          o.equals(s += "mushrooms");
100 
101         (s = "thin crust").equals("thick crust");
102 
103         (s += "garlic").equals("basil");
104 
105         ("Chicago Style" + "NY Style").equals("California Style" + "Any Style");
106 
107         equals("peppers");
108 
109         "onions".equals(o);
110 
111         o.equals(new Object());
112 
113         o.equals(equals(o));
114 
115         equals("yummy");
116 
117         new Object().equals("more cheese");
118 
119         InputEqualsAvoidNullOutter outter = new InputEqualsAvoidNullOutter();
120 
121         outter.new InputEqualsAvoidNullInner().equals("eat pizza and enjoy inner classes");
122     }
123 
124     /**
125      * methods that should not get flagged
126      */
127     public void noFlagForEqualsIgnoreCase() {
128         String s = "peperoni";
129         String s1 = "tasty";
130 
131         s.equalsIgnoreCase(s += "mushrooms");
132 
133         s1.equalsIgnoreCase(s += "mushrooms");
134 
135         (s = "thin crust").equalsIgnoreCase("thick crust");
136 
137         (s += "garlic").equalsIgnoreCase("basil");
138 
139         ("Chicago Style" + "NY Style").equalsIgnoreCase("California Style" + "Any Style");
140 
141         "onions".equalsIgnoreCase(s);
142 
143         s.equalsIgnoreCase(new String());
144 
145         s.equals(s1);
146 
147         new String().equalsIgnoreCase("more cheese");
148 
149     }
150 
151     public void noFlagForBoth() {
152         Object o = new Object();
153         String s = "peperoni";
154         String s1 = "tasty";
155 
156         o.equals(s += "mushrooms");
157 
158         (s = "thin crust").equals("thick crust");
159 
160         (s += "garlic").equals("basil");
161 
162         ("Chicago Style" + "NY Style").equals("California Style" + "Any Style");
163 
164         equals("peppers");
165 
166         "onions".equals(o);
167 
168         o.equals(new Object());
169 
170         o.equals(equals(o));
171 
172         equals("yummy");
173 
174         new Object().equals("more cheese");
175 
176         InputEqualsAvoidNullOutter outter = new InputEqualsAvoidNullOutter();
177 
178         outter.new InputEqualsAvoidNullInner().equals("eat pizza and enjoy inner classes");
179 
180         s.equalsIgnoreCase(s += "mushrooms");
181 
182         s1.equalsIgnoreCase(s += "mushrooms");
183 
184         (s = "thin crust").equalsIgnoreCase("thick crust");
185 
186         (s += "garlic").equalsIgnoreCase("basil");
187 
188         ("Chicago Style"+"NY Style").equalsIgnoreCase("California Style"+"Any Style");
189 
190         "onions".equalsIgnoreCase(s);
191 
192         s.equalsIgnoreCase(new String());
193 
194         s.equals(s1);
195 
196         new String().equalsIgnoreCase("more cheese");
197 
198     }
199 
200 }
201 
202 class InputEqualsAvoidNullOutter {
203     public class InputEqualsAvoidNullInner {
204             public boolean equals(Object o) {
205                 return true;
206             }
207     }
208 }
209 
210 class MyString {
211     public boolean equals() {
212         return true;
213     }
214 
215     public boolean equals(String s1) {
216         return true;
217     }
218 
219     public boolean equalsIgnoreCase() {
220         return true;
221     }
222 
223     public boolean equalsIgnoreCase(String s1) {
224         return true;
225     }
226 
227     private String pizza;
228 
229     public void main() {
230         MyString myString = new MyString();
231         myString.equals();
232         myString.equals("what");
233         myString.equalsIgnoreCase();
234         myString.equalsIgnoreCase("what");
235         myString.equals(this.pizza = "cold pizza");
236     }
237 }
238 
239 class NewTest {
240     static String classVar;
241     String instanceVar;
242     NewTest testObj = new NewTest("");
243 
244     NewTest(String param) {
245         param.equals(""); // violation 'left .* of .* equals'
246     }
247 
248     public void method(String param) {
249         final String localVar = "";
250 
251         localVar.equals(""); // violation 'left .* of .* equals'
252         param.equals(""); // violation 'left .* of .* equals'
253 
254         classVar.equals(""); // violation 'left .* of .* equals'
255         instanceVar.equals(""); // violation 'left .* of .* equals'
256         NewTest.classVar.equals(""); // violation 'left .* of .* equals'
257         this.classVar.equals(""); // violation 'left .* of .* equals'
258         this.instanceVar.equals(""); // violation 'left .* of .* equals'
259 
260         NewTest testObj = new NewTest("");
261         this.testObj.instanceVar.equals(""); // not violated, too confusing
262         testObj.classVar.equals(""); // not violated
263 
264         for (Nested instanceVar = new Nested(); instanceVar != null; ) {
265             instanceVar.equals(1);
266             if (instanceVar.equals("")) {
267                 instanceVar.equals("");
268             }
269         }
270 
271         class Inner {
272             String instanceVarInner;
273 
274             public void main() {
275                 classVar.equals(""); // violation 'left .* of .* equals'
276                 instanceVar.equals(""); // violation 'left .* of .* equals'
277                 NewTest.classVar.equals(""); // violation 'left .* of .* equals'
278 
279                 instanceVarInner.equals(""); // violation 'left .* of .* equals'
280                 this.instanceVarInner.equals(""); // violation 'left .* of .* equals'
281                 localVar.equals(""); // violation 'left .* of .* equals'
282 
283                 NewTest testObj = new NewTest("");
284                 testObj.instanceVar.equals(""); // not violated
285                 testObj.classVar.equals(""); // not violated
286 
287                 Inner testInnerObj = new Inner();
288                 testInnerObj.instanceVarInner.equals(""); // not violated
289             }
290         }
291 
292         Inner testInnerObj = new Inner();
293         testInnerObj.instanceVarInner.equals(""); // not violated
294 
295         Nested.nestedClassVar.equals(""); // not violated, because the equals call is not
296         Nested Nested = new Nested(); // embedded in class Nested, what can lead to really
297         Nested.nestedInstanceVar.equals(""); // confusing constructions. But could be improved.
298         Nested.nestedClassVar.equals("");
299     }
300     static {
301         final String s = "";
302         s.equals(""); // violation 'left .* of .* equals'
303         {
304             final String x = "";
305             class A {
306                 void foo() {
307                     s.equals(""); // violation 'left .* of .* equals'
308                     x.equals(""); // violation 'left .* of .* equals'
309                 }
310             }
311         }
312     }
313     void foo(String param) {
314         try {
315             param.equals(""); // violation 'left .* of .* equals'
316             do {
317                 String s = "";
318                 s.equals(""); // violation 'left .* of .* equals'
319             } while (param.equals("")); // violation 'left .* of .* equals'
320         } catch (Exception e) {
321             while (param.equals("")) { // violation 'left .* of .* equals'
322                 for (String s = ""; s.equals(""); ){ // violation 'left .* of .* equals'
323                     if (s.equals("")) { // violation 'left .* of .* equals'
324                         synchronized (this) {
325                             switch (s) {
326                                 case "1": String str = "";
327                                 str.equals(""); // violation 'left .* of .* equals'
328                                 case "2": s.equals(""); str = ""; // violation 'left .*of.*equals'
329                                 str.equals(""); // violation 'left .* of .* equals'
330                                 case "3": param.equals(""); // violation 'left .* of .* equals'
331                                     break;
332                             }
333                         }
334                     }
335                 }
336             }
337         }
338     }
339     static class Nested {
340         static String nestedClassVar;
341         String nestedInstanceVar;
342         public void method() {
343             classVar.equals(""); // violation 'left .* of .* equals'
344             NewTest.classVar.equals(""); // violation 'left .* of .* equals'
345             this.nestedInstanceVar.equals(""); // violation 'left .* of .* equals'
346             nestedClassVar.equals(""); // violation 'left .* of .* equals'
347             nestedInstanceVar.equals(""); // violation 'left .* of .* equals'
348 
349             class Inner {
350                 public void method() {
351                     classVar.equals(""); // violation 'left .* of .* equals'
352                     NewTest.classVar.equals(""); // violation 'left .* of .* equals'
353                     nestedClassVar.equals(""); // violation 'left .* of .* equals'
354                     nestedInstanceVar.equals(""); // violation 'left .* of .* equals'
355                 }
356             }
357         }
358     }
359     enum EmbeddedEnum {
360         A(129),
361         B(283),
362         C(1212) {
363             String constDefVar;
364             public void doSomething() {
365                 constDefVar.equals(""); // violation 'left .* of .* equals'
366             }
367         };
368 
369         Map.Entry<String,Long> enumInstance;
370 
371         EmbeddedEnum(int i) {
372             enumInstance.equals("");
373         }
374 
375         public static void doSomethingStatic() {
376             enumStatic.equals(""); // violation 'left .* of .* equals'
377             enumStatic.equals(null);
378         }
379         static String enumStatic;
380     }
381 
382     private String foo() {return "";}
383     private Object foo(int i) {return i;}
384 
385     Object o2 = new Object();
386     Object o3 = new Object();
387     private void bar() {
388         foo().equals(""); // methods are not checked
389         foo(0).equals("");
390         this.foo().equals("");
391         Object o1 = new Object(); o1.equals("");
392         o2.equals(""); String o2 = "";
393         o3.equals("");
394 String o3 = "";
395     }
396 }
397 class Anonymous {
398     public static void main(String[] args) {
399         Runnable anonym = new Runnable() {
400             String nullableStr = null;
401             public void run() {
402                 nullableStr.equals("Null"); // violation 'left .* of .* equals'
403             };
404         };
405         Object nullableStr = new Object();
406         nullableStr.equals("");
407     }
408     {}
409 }
410 
411 enum TestEnum {
412     ONE;
413     public void foo() {
414         TestEnum.ONE.equals(this);
415         this.ONE.equals(this);
416     }
417 }
418 
419 class TestConcatenations {
420     String s = null;
421 
422     void foo() {
423         s.equals(s + s); // violation 'left .* of .* equals'
424         s.equals("a" + "b"); // violation 'left .* of .* equals'
425         s.equals(getInt() + s); // violation 'left .* of .* equals'
426         s.equals(getInt() + getInt());
427         s.endsWith("a");
428         String s = "";
429         if (!s.equals("Hi[EOL]"+System.getProperty("line.separator")))//violation 'left.*of.*equals'
430             foo();
431     }
432 
433     int getInt() {
434         return (Integer) null;
435     }
436 }
437 
438 class TestThisWithNotStringInstance {
439 
440     MyString notString;
441 
442     void foo() {
443         this.notString.equals("");
444     }
445 
446 }