PMD요구수준 [펌]네이버개발자센터

하루업무가 종료되기전 오늘 짠코드들을 PMD 및 Findbugs로 돌린다.

현재 진행중인 프로젝트 요구사항으로 .


  1. .
  2. .
  3. .
  4. .
  5. .
  6. Rule#01. EmptyCatchBlock
  7. 설명: catch 사용
  8. 오류코드:public void doSomething() {
  9. try
  10. {
  11. FileInputStream fis = new FileInputStream("/tmp/bugger");
  12. }
  13. catch (IOException ioe)
  14. {
  15. //
  16. }
  17. }권장방안: Catch Block 반드시 예외를 다루는 코드를 작성
  18. --------------------------------------------------------------------------------
  19. Rule#02. EmptyIfStmt
  20. 설명: if 사용
  21. 오류코드:public class Foo {
  22. void bar(int x) {
  23. if (x == 1) {
  24. //
  25. }
  26. }
  27. }권장방안: if 구문의 사용을 피하도록
  28. --------------------------------------------------------------------------------
  29. Rule#03. EmptyWhileStmt
  30. 설명: while 사용
  31. 오류코드:public class Foo {
  32. void bar(int a, int b) {
  33. while (a == b) {
  34. //
  35. }
  36. }
  37. }권장방안: while 구문 사용을 피하도록
  38. --------------------------------------------------------------------------------
  39. Rule#04. EmptyTryBlock
  40. 설명: try 블록 사용
  41. 오류코드:public class Foo {
  42. public void bar() {
  43. try
  44. {
  45. }
  46. catch (Exception e)
  47. {
  48. e.printStackTrace();
  49. }
  50. }
  51. }권장방안: 내용이 없는 try 블록이 없어야
  52. --------------------------------------------------------------------------------
  53. Rule#05. EmptyFinallyBlock
  54. 설명: finally 블록 사용
  55. 오류코드:public class Foo {
  56. public void bar() {
  57. try
  58. {
  59. int x=3;
  60. }
  61. finally
  62. {
  63. //
  64. }
  65. }
  66. }권장방안: 내용이 없는 finally 블록이 존재하지 말아야
  67. --------------------------------------------------------------------------------
  68. Rule#06. UnnecessaryConversionTemporary
  69. 설명: 불필요한 String 변환작업
  70. 오류코드:public String convert(int x) {
  71. String foo = new Integer(x).toString();
  72. return foo;
  73. }권장방안: 기본 데이터 타입을 String으로 변환할 불필요한 임시 변환 작업을 피하도록
  74. --------------------------------------------------------------------------------
  75. Rule#07. EmptyStatementNotInLoop
  76. 설명: 필요없는 ;문장 존재
  77. 오류코드:public class MyClass {
  78. public void doit() {
  79. ;
  80. System.out.println("look at the extra semicolon");;
  81. }
  82. }권장방안: 필요없는 문장 (;)이 없어야
  83. --------------------------------------------------------------------------------
  84. Rule#08. WhileLoopsMustUseBraces
  85. 설명: 중괄호 없는 while
  86. 오류코드:public void doSomething() {
  87. while (true)
  88. x++;
  89. }권장방안: 중괄호없이 사용된 while문의 사용은 바람직하지 못한 코딩 습관임 (피해야 함)
  90. --------------------------------------------------------------------------------
  91. Rule#09. AssignmentInOperand
  92. 설명: 피연산자 할당문 사용
  93. 오류코드:public class Foo {
  94. public void bar() {
  95. int x = 2;
  96. if ( (x = getX() ) == 3) {
  97. System.out.println("3!");
  98. }
  99. }
  100. private int getX() {
  101. return 3;
  102. }
  103. }권장방안: 피연산자내에 할당문이 없어야 함. 해당 코드를 복잡하고 가독성이 떨어지게 만듬
  104. --------------------------------------------------------------------------------
  105. Rule#10. UnnecessaryParentheses
  106. 설명: 불필요한 괄호사용
  107. 오류코드:public class Foo {
  108. boolean bar() {
  109. return (true);
  110. }
  111. }권장방안: 괄호가 없어도 되는 상황에서 불필요한 괄호를 사용할 경우 마치 메소드 호출처럼 보여서 소스 코드의 가독성을 떨어뜨릴 있음
  112. --------------------------------------------------------------------------------
  113. Rule#11. SimplifyBooleanExpressions
  114. 설명: 불필요 boolean 연산 시도
  115. 오류코드:public class Bar {
  116. private boolean bar = (isFoo() == true);
  117. public isFoo() {
  118. return false;
  119. }
  120. }권장방안: boolean 사용 불필요한 비교 연산을 피하도록
  121. --------------------------------------------------------------------------------
  122. Rule#12. SwitchStmtsShouldHaveDefault
  123. 설명: default 없는 switch 구문 사용
  124. 오류코드:public class Foo {
  125. public void bar() {
  126. int x = 2;
  127. switch (x) {
  128. case 2;
  129. int j = 8;
  130. }
  131. }
  132. }권장방안: Switch구문에는 반드시 default label 있어야
  133. --------------------------------------------------------------------------------
  134. Rule#13. AvoidReassigningParameters
  135. 설명: parameter 재할당 시도
  136. 오류코드:public class Foo {
  137. private void foo(String bar) {
  138. bar = "something else";
  139. }
  140. }권장방안: 넘겨받는 메소드 parameter 값을 직접 변경하지 말아야 함.
  141. --------------------------------------------------------------------------------
  142. Rule#14. FinalFieldCouldBeStatic
  143. 설명: final field static 전환
  144. 오류코드:public class Foo {
  145. public final int BAR = 42;
  146. }권장방안: final field static으로 변경하면 overhead 줄일 있음
  147. --------------------------------------------------------------------------------
  148. Rule#15. EqualsNull
  149. 설명: equals()을 이용한 null 비교
  150. 오류코드:class Bar {
  151. void foo() {
  152. String x = "foo";
  153. if (x.equals(null)) {
  154. doSomething();
  155. }
  156. }
  157. }권장방안: null 값과 비교하기 위해 equals 메소드를 사용하지 말아야
  158. --------------------------------------------------------------------------------
  159. Rule#16. SimpleDateFormatNeedsLocale
  160. 설명: 지역코드없는 SimpleDateFormat 사용
  161. 오류코드:public class Foo {
  162. private SimpleDateFormat sdf = new SimpleDateFormat("pattern");
  163. }권장방안: SimpleDateFormat 인스턴스를 생성할때 Locale 지정하는 것이 바람직함
  164. --------------------------------------------------------------------------------
  165. Rule#17. ImmutableField
  166. 설명: 생성자 지정 변수의 final 미적용
  167. 오류코드:public class Foo {
  168. private int x;
  169. public Foo() {
  170. x = 7;
  171. }
  172. public void foo() {
  173. int a = x + 2;
  174. }
  175. }권장방안: 생성자를 통해 할당된 변수를 Final 선언하는 것이 바람직함
  176. --------------------------------------------------------------------------------
  177. Rule#18. AssignmentToNonFinalStatic
  178. 설명: static 필드의 잘못된 사용
  179. 오류코드:public class StaticField {
  180. static int x;
  181. public FinalFields(int y) {
  182. x = y;
  183. }
  184. }권장방안: static 필드의 안전하지 않은 사용 가능성이 존재
  185. --------------------------------------------------------------------------------
  186. Rule#19. AvoidSynchronizedAtMethodLevel
  187. 설명: synchronization 과다적용
  188. 오류코드:public class Foo {
  189. synchronized void foo() {
  190. }
  191. }권장방안: mothod 레벨의 synchronization 보다 block 레벨 synchronization 사용하는 것이 바람직함
  192. --------------------------------------------------------------------------------
  193. Rule#20. AbstractClassWithoutAbstractMethod
  194. 설명: 추상클래스 정의 오류
  195. 오류코드:public abstract class Foo {
  196. void int method1() {
  197. // ...
  198. }
  199. void int method2() {
  200. // ...
  201. }
  202. }권장방안: Abstract Class내에 Abstract Method 존재하지 않음
  203. --------------------------------------------------------------------------------
  204. Rule#21. UncommentedEmptyMethod
  205. 설명: 메소드 주석표기
  206. 오류코드:public void doSomething() {
  207. }권장방안: 메소드에 빈메소드임을 나타내는 주석을 추가할
  208. --------------------------------------------------------------------------------
  209. Rule#22. AvoidConstantsInterface
  210. 설명: 인터페이스에 상수 적용
  211. 오류코드:public interface ConstantsInterface {
  212. public static final int CONSTANT1 = 0;
  213. public static final String CONSTANT2 = "1";
  214. }권장방안: Interface 클래스의 behavior 구현하는 데에만 사용해야
  215. --------------------------------------------------------------------------------
  216. Rule#23. DuplicateImports
  217. 설명: import문의 중복 선언
  218. 오류코드:import java.lang.String;
  219. import java.lang.*;
  220. public class Foo {
  221. }권장방안: import문은 중복 선언이 없어야
  222. --------------------------------------------------------------------------------
  223. Rule#24. ImportFromSamePackage
  224. 설명: 불필요한 import 선언
  225. 오류코드:package foo;
  226. import foo.Buz;
  227. import foo.*;
  228. public class Bar {
  229. }권장방안: 동일 패키지에 있을 때는 import문을 사용할 필요가 없음
  230. --------------------------------------------------------------------------------
  231. Rule#25. SystemPrintln
  232. 설명: System.out.print 사용
  233. 오류코드:class Foo{
  234. public void testA () {
  235. System.out.println("Entering test");
  236. }
  237. }권장방안: System.out.print 사용을 피해야 함. 전용 로거를 사용할 것을 권장
  238. --------------------------------------------------------------------------------
  239. Rule#26. VariableNamingConventions
  240. 설명: 변수명에 밑줄 사용
  241. 오류코드:public class Foo {
  242. public static final int MY_NUM = 0;
  243. public String myTest = "";
  244. DataModule dmTest = new DataModule();
  245. }권장방안: final 아닌 변수는 밑줄을 포함하지 말아야
  246. --------------------------------------------------------------------------------
  247. Rule#27. MisleadingVariableName
  248. 설명: 변수명에 잘못된 prefix 사용
  249. 오류코드:public class Foo {
  250. public void bar(String m_baz) {
  251. int m_boz = 42;
  252. }
  253. }권장방안: non-field 이름이 m_ 으로 시작하지 말아야
  254. --------------------------------------------------------------------------------
  255. Rule#28. AvoidArrayLoops
  256. 설명: 루프문을 이용한 배열복사
  257. 오류코드:public class Test {
  258. public void bar() {
  259. int[] a = new int[10];
  260. int[] b = new int[10];
  261. for (int i=0;i<10;i++) {
  262. b[i]=a[i];
  263. }
  264. }
  265. }권장방안: 배열의 값을 루프문을 이용하여 복사하는 보다, System.arraycopy() 메소드를 이용하여 복사하는 것이 효율적이며 수행 속도가 빠름
  266. --------------------------------------------------------------------------------
  267. Rule#29. UnnecessaryWrapperObjectCreation
  268. 설명: 불필요한 WrapperObject 생성
  269. 오류코드:public int convert(String s) {
  270. int i, i2;
  271. i = Integer.valueOf(s).intValue();
  272. i2 = Integer.valueOf(i).intValue();권장방안: 불필요한 Wrapper Object 생성되었음. 탐지된 코드는 삭제하고, 별도의 parse관련 전용 메소드 사용을 권장
  273. --------------------------------------------------------------------------------
  274. Rule#30. AvoidThrowingRawExceptionTypes
  275. 설명: 비가공 Exception 사용
  276. 오류코드:public class Foo {
  277. public void bar() throws Exception {
  278. throw new Exception();
  279. }
  280. }권장방안: 가공되지 않은 Exception throw하는 것은 비추천
  281. --------------------------------------------------------------------------------
  282. Rule#31. AvoidThrowingNullPointerException
  283. 설명: NullPointerException 사용
  284. 오류코드:public class Foo {
  285. void bar() {
  286. throw new NullPointerException();
  287. }
  288. }권장방안: NullPointerException throw하는 것은 비추천
  289. --------------------------------------------------------------------------------
  290. Rule#32. StringInstantiation
  291. 설명: 불필요 String Instance 생성
  292. 오류코드:public class Foo {
  293. private String bar = new String("bar");
  294. }권장방안: 불필요한 String Instance 생성하는 코드가 없어야 함. 간단한 형태의 코드로 변경 필요
  295. --------------------------------------------------------------------------------
  296. Rule#33. StringToString
  297. 설명: 불필요한 toString() 메소드 사용
  298. 오류코드:public class Foo {
  299. private String baz() {
  300. String bar = "howdy";
  301. return bar.toString();
  302. }
  303. }권장방안: String 객체에서 toString()함수를 사용하는 것은 불필요함. 해당 코드 제거 필요
  304. --------------------------------------------------------------------------------
  305. Rule#34. InefficientStringBuffering
  306. 설명: StringBuffer 함수내 결합코드 사용
  307. 오류코드:StringBuffer sb = new StringBuffer( "tmp =" +
  308. System.getProperty("java.io.tmpdir") );권장방안: StringBuffer 함수내에서 비문자열 연산 이용하여 직접 결합하는 코드 사용을 탐지. append 메소드 사용을 권장
  309. --------------------------------------------------------------------------------
  310. Rule#35. InefficientEmptyStringCheck
  311. 설명: 빈문자열 확인
  312. 오류코드:public class Foo {
  313. void bar(String string) {
  314. if (string != null && string.trim().size() > 0) {
  315. doSomething();
  316. }
  317. }
  318. }권장방안: 문자열 확인을 위해 String.trim().length() 사용하는 것은 피하도록 함. whitespace/Non-whitespace 확인을 위한 별도의 로직 구현을 권장
  319. --------------------------------------------------------------------------------
  320. Rule#36. UselessStringValueOf
  321. 설명: 불필요한 String.valueOf 사용
  322. 오류코드:public String convert(int i) {
  323. String s;
  324. s = "a" + String.valueOf(i);
  325. return s;
  326. }권장방안: String append 경우, String.valueOf 함수를 사용할 필요 없음
  327. --------------------------------------------------------------------------------
  328. Rule#37. UnusedPrivateField
  329. 설명: 미사용 private field
  330. 오류코드:public class Something {
  331. private static int FOO = 2; // Unused
  332. private int i = 5; // Unused
  333. private int j = 6;
  334. public int addOne() {
  335. return j++;
  336. }
  337. }권장방안: 사용되지 않는 Private field 탐지 해당 소스 확인 후, 삭제 등의 조치
  338. --------------------------------------------------------------------------------
  339. Rule#38. UnusedPrivateMethod
  340. 설명: 미사용 private method
  341. 오류코드:public class Something {
  342. private void foo() {} // unused
  343. }권장방안: 사용되지 않는 Private Method 선언을 탐지 해당 소스 확인 후, 삭제 등의 조치
  344. --------------------------------------------------------------------------------
  345. Rule#39. UnusedFormalParameter
  346. 설명: 미사용 method parameter
  347. 오류코드:public class Foo {
  348. private void bar(String howdy) {
  349. // howdy is not used
  350. }
  351. }권장방안: 메소드 선언 내에사용되지 않는 파라미터를 탐지 해당 소스 확인 후, 삭제 등의 조치
  352. [펌]네이버개발자센터