실 용적 이지 만 고 집 스 러 운 자바 프로 그래 밍 기술 10 가 지 를 정리 하 다.

머리말
인 코딩 에 한동안 빠 진 후에(예 를 들 어 내 가 20 년 정도 프로그램 에 투 입 했 을 때)너 는 점점 이런 것들 에 익숙해 질 것 이다.왜냐하면,네가 알 고 있 는...............................................................
이것 이 바로 우리 가'방어 적 프로 그래 밍',즉 일부 편집 습관 을 채택 해 야 하 는 이유 이다.다음은 제 가 개인 적 으로 생각 하 는 가장 유용 하지만 고 집 스 러 운 자바 프로 그래 밍 기술 10 개 입 니 다.같이 보 자.
1.String 문자열 을 맨 앞 에 놓 기
우발 적 인 NullPointer Exception 이상 을 방지 하기 위해 서,우 리 는 보통 String 을equals()함수 의 왼쪽 에 놓 아서 문자열 비 교 를 실현 합 니 다.다음 코드:

// Bad
if (variable.equals("literal")) { ... }
// Good
if ("literal".equals(variable)) { ... }
이것 은 마음대로 머리 를 써 서 생각하면 할 수 있 는 일이 다.Bad 버 전의 코드 에서 표현 식 을 바 꾸 고 Good 버 전의 코드 까지 중간 에 아무것도 잃 어 버 리 지 않 는 다.다른 관점 을 환영 합 니 다.
2.초기의 JDK API 를 믿 지 마 세 요.
자바 초기 에 프로 그래 밍 은 매우 고통스러운 일 이 었 다.그 API 들 은 여전히 성숙 하지 않 습 니 다.아마도 아래 코드 블록 을 만 났 을 것 입 니 다.

String[] files = file.list();
// Watch out
if (files != null) {
 for (int i = 0; i < files.length; i++) {
 ...
 }
}
고 집 스 러 워 보 여요?글 쎄 요.하지만 자바 doc 를 보 세 요.
이 가상 경로 가 폴 더 디 렉 터 리 를 표시 하지 않 으 면 null 로 돌아 갑 니 다.그렇지 않 으 면 디 렉 터 리 의 파일 이나 폴 더 를 표시 하 는 문자열 배열 을 되 돌려 줍 니 다.
네,맞아요.우 리 는 약간의 검증 을 추가 할 수 있다.

if (file.isDirectory()) {
 String[] files = file.list();
 // Watch out
 if (files != null) {
 for (int i = 0; i < files.length; i++) {
  ...
 }
 }
}
3.믿 지 마 세 요."-1"
나 는 이것 이 고 집 스 러 운 것 이라는 것 을 알 고 있 지만,자바 doc 에 서 는String.indexOf()방법 에 대해 대상 내 에서 처음으로 지정 한 문자 의 위치 색인 이 나 타 났 으 며,-1 이면 이 문자 가 문자 시퀀스 에 있 지 않다 는 것 을 나타 낸다.
그래서 사용.-1 은 당연한 거 죠?그 렇 죠?제 말 이 틀 렸 습 니 다.다음 코드 를 보 세 요.

// Bad
if (string.indexOf(character) != -1) { ... }
// Good
if (string.indexOf(character) >= 0) { ... }
그 걸 누가 알 아?아마도 그때 그들 은 인 코딩 방식 을 바 꾸 었 을 것 입 니 다.문자열 에 대해 대소 문 자 를 구분 하지 않 습 니 다.아마도 더 좋 은 방법 은-2 로 돌아 가 는 것 일 것 입 니 다.그 걸 누가 알 아?
4.의외 의 할당 을 피한다.
예.이런 일 은 아마도 자주 발생 할 것 이다.

// Ooops
if (variable = 5) { ... }
// Better (because causes an error)
if (5 = variable) { ... }
// Intent (remember. Paranoid JavaScript: ===)
if (5 === variable) { ... }
따라서 예상 치 못 한 할당 오류 가 발생 하지 않도록 비교 상수 를 왼쪽 에 두 면 됩 니 다.
5.Null 과 Length 검사
어쨌든 집합,배열 등 이 있 으 면 존재 하고 비어 있 지 않도록 하 세 요.

// Bad
if (array.length > 0) { ... }
// Good
if (array != null && array.length > 0) { ... }
이 배열 들 이 어디서 왔 는 지,초기 버 전의 JDK API 에서 왔 는 지 누가 알 겠 는가?
6.모든 방법 은 final 입 니 다.
너 는 아마 나 에 게 너의 개폐 원칙 을 알려 줄 것 이다.그러나 이것 은 모두 헛소리 이다.나 는 너 를 믿 지 않 는 다.그래서 그런 의미 가 명확 한 방법 에 대해 서 는 final 표 지 를 엄 격 히 사용 해 야 한다.

// Bad
public void boom() { ... }
// Good. Don't touch.
public final void dontTouch() { ... }
7.모든 변수 와 매개 변 수 는 final 입 니 다.
내 말대 로나 는 나 자신 을 믿 지 않 는 다.그럼 에 도 불구 하고 내 가 나 를 믿 지 않 는 것 은...

모든 변수 와 인자 가 final 인 이유

// Bad
void input(String importantMessage) {
 String answer = "...";
 answer = importantMessage = "LOL accident";
}
// Good
final void input(final String importantMessage) {
 final String answer = "...";
}
8.무 거 운 짐 을 실 을 때 범 형 을 믿 지 마 세 요.
예,일어 날 수 있 습 니 다.당신 은 당신 이 쓴 아주 예 쁜 API 를 믿 습 니 다.그것 은 매우 직관 적 이 고 이에 따 른 것 입 니 다.일부 사용자 들 은 누가 원본 형식 을 Object 형식 으로 바 꾸 었 습 니까?그 빌어먹을 컴 파일 러 가 불평 을 멈 추고 갑자기 잘못된 방법 을 연결 할 것 입 니 다.이것 이 당신 의 잘못 이 라 고 생각 합 니 다.
다음 코드 보기:

// Bad
<T> void bad(T value) {
 bad(Collections.singletonList(value));
}
<T> void bad(List<T> values) {
 ...
}
// Good
final <T> void good(final T value) {
 if (value instanceof List)
 good((List<?>) value);
 else
 good(Collections.singletonList(value));
}
final <T> void good(final List<T> values) {
 ...
}
왜냐하면,당신 은...당신 의 사용자,그들 은 마치

// This library sucks
@SuppressWarnings("all")
Object t = (Object) (List) Arrays.asList("abc");
bad(t);
날 믿 어.이 모든 것 을 나 는 다 본 적 이 있다.아래

이런 편집 증 은 그래도 괜찮다.
9.항상 Switch 문장의 Default 에서 이상 을 던 집 니 다.
Switch 문 구 는..........................................................................................

// Bad
switch (value) {
 case 1: foo(); break;
 case 2: bar(); break;
}
// Good
switch (value) {
 case 1: foo(); break;
 case 2: bar(); break;
 default:
 throw new ThreadDeath("That'll teach them");
}
value===3 이 되면 찾 을 수 없 는 힌트 가 나타 나 고 모 르 게 됩 니 다.
10.스위치 문 에 꽃 괄호 가 있다.
사실 switch 는 가장 사악 한 문구 입 니 다.술 에 취하 거나 내기 에서 진 사람들 이 코드 를 쓰 는 것 처럼 다음 의 예 를 보 세 요.

// Bad, doesn't compile
switch (value) {
 case 1: int j = 1; break;
 case 2: int j = 2; break;
}
// Good
switch (value) {
 case 1: {
 final int j = 1;
 break;
 }
 case 2: {
 final int j = 2;
 break;
 }
 // Remember:
 default: 
 throw new ThreadDeath("That'll teach them");
}
switch 구문 에서 모든 case 문장의 범 위 는 한 줄 의 문구 만 있 습 니 다.사실은 이런 case 문 구 는 심지어 진정한 문구 가 아 닙 니 다.그들 은 goto 문장의 도약 표지 와 같 습 니 다.
총결산
편집 프로 그래 밍 은 신기 한 것 같 습 니 다.코드 가 더 상세 하 다 는 것 이 자주 증명 되 지만 필요 한 것 은 아 닙 니 다."아,이 건 절대 일어나 지 않 을 거 야"라 고 생각 할 수도 있 지만,내 가 말 한 것 처럼.20 년 정도 의 프로 그래 밍 을 거 쳐 이런 어 리 석 은 bug 만 복구 하 는 것 을 원 하지 않 습 니 다.프로 그래 밍 언어 가 이렇게 낡 고 결함 이 있 기 때 문 입 니 다.알 잖 아.
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기