Java Language
오라클 공식 코드 표준
수색…
소개
Java 프로그래밍 언어에 대한 오라클 공식 스타일 가이드 는 오라클 개발자가 따라야 할 표준으로 다른 Java 개발자가 따라 다니는 것이 좋습니다. 파일 이름, 파일 구성, 들여 쓰기, 주석, 선언, 명령문, 공백, 명명 규칙, 프로그래밍 실습을 다루며 코드 예를 포함합니다.
비고
위의 예는 오라클의 새로운 공식 스타일 가이드 를 엄격하게 따릅니다. 다른 말로하면이 페이지의 저자가 주관적으로 작성한 것은 아닙니다 .
공식 스타일 가이드는 원래 스타일 가이드 및 야생에서 코드의 대부분과 역 호환되도록 신중하게 작성되었습니다.
공식 스타일 가이드가되어 피어 검토 다른 사람의 사이에서, 브라이언 게츠 (Java 언어의 설계자)와 마크 레인 홀드 (Java 플랫폼의 수석 건축가).
예제는 비 규범 적이다. 코드를 올바르게 포맷하는 방법을 설명하려고하지만 코드를 올바르게 포맷 할 수있는 다른 방법이있을 수 있습니다. 이는 일반적인 원칙입니다. 코드를 형식화하는 여러 가지 방법이있을 수 있습니다. 모두 공식 지침을 준수해야합니다.
이름 지정 규칙
패키지 이름
- 패키지 이름은 밑줄이나 다른 특수 문자없이 모두 소문자 여야합니다.
- 패키지 이름은 개발자 회사 웹 주소의 역전 된 권한 부분으로 시작합니다. 이 부분은 프로젝트 / 프로그램 구조에 종속적 인 패키지 하부 구조에 의해 추적 될 수 있습니다.
- 복수형을 사용하지 마십시오. 인스턴스에 사용하는 표준 API의 규칙에 따라
java.lang.annotation
하지java.lang.annotations
. - 예 :
com.yourcompany.widget.button
,com.yourcompany.core.api
클래스, 인터페이스 및 열거 형 이름
- 클래스 및 열거 형 이름은 일반적으로 명사이어야합니다.
- 인터페이스 이름은 일반적으로 ... able로 끝나는 명사 또는 형용사 여야합니다.
- 대문자 (예 : CamelCase )의 각 단어의 첫 글자와 대소 문자를 섞어서 사용하십시오.
- 정규 표현식
^[AZ][a-zA-Z0-9]*$
일치하십시오. - 약자가 긴 형식보다 더 많이 사용되지 않는 경우 전체 단어를 사용하고 약어 사용을 피하십시오.
- 약어가 더 긴 클래스 이름의 일부이면 단어로 형식을 지정하십시오.
- 예제 :
ArrayList
,BigInteger
,ArrayIndexOutOfBoundsException
,Iterable
.
메소드 이름
메소드 이름은 일반적으로 동사 또는 액션에 대한 다른 설명이어야합니다.
-
^[az][a-zA-Z0-9]*$
정규식과 일치해야합니다. - 소문자의 첫 글자와 대소 문자를 섞어서 사용하십시오.
- 예 :
toString
,hashCode
변수
변수 이름은 소문자의 첫 글자와 대소 문자가 혼합되어야합니다.
- 정규식
^[az][a-zA-Z0-9]*$
일치하십시오. - 추가 권장 사항 : 변수
- 예제 :
elements
,currentIndex
유형 변수
타입 변수가 거의없는 간단한 경우에는 하나의 대문자를 사용하십시오.
- 정규 표현식
^[AZ][0-9]?$
일치하십시오. - 한 글자가 다른 글자보다 더 구체적이면 (예 :
K
와V
는 키와 값은 맵에,R
은 함수 반환 유형), 그렇지 않으면T
사용하십시오. - 단일 문자 유형 변수가 혼동되는 복잡한 경우에는 대문자로 작성된 긴 이름을 사용하고 밑줄 (
_
)을 사용하여 단어를 구분하십시오. - 예 :
T
,V
,SRC_VERTEX
상수
언어 규칙이나 규칙에 따라 내용이 변경되지 않는 static final
필드는 대문자와 밑줄 ( _
)로 구분하여 단어를 구분해야합니다.
- 정규식
^[AZ][A-Z0-9]*(_[A-Z0-9]+)*$
일치하십시오. - 예 :
BUFFER_SIZE
,MAX_LEVEL
이름 지정에 대한 다른 지침
- 외부 범위에서 메소드, 변수 및 유형 변수를 숨기거나 섀도 잉하지 마십시오.
- 이름의 상세한 표시가 범위의 크기와 관련되도록합시다. 예를 들어, 대형 클래스의 필드에는 설명이 포함 된 이름을 사용하고 로컬 단명 변수에는 간단한 이름을 사용합니다.
- public static 멤버의 이름을 지정할 때 식별자가 정적으로 가져올 것이라고 생각되면 식별자를 자체 설명 형으로 지정하십시오.
- 추가 정보 : 네이밍 섹션 (공식 자바 스타일 가이드)
출처 : 오라클의 자바 스타일 가이드 라인
Java 소스 파일
모든 줄은 CR이나 CR + LF가 아닌 줄 바꿈 문자 (LF, ASCII 값 10)로 끝나야합니다.
줄 끝 부분에 후행 공백이 없어야합니다.
소스 파일의 이름은 패키지 개인 클래스 만 포함하는 파일의 경우에도
.java
확장자가 뒤에 오는 클래스의 이름과 동일해야합니다. 이것은package-info.java
와 같이 클래스 선언을 포함하지 않는 파일에는 적용되지 않습니다.
특수 문자
LF 외에도 공백 문자 (ASCII 값 32) 만 허용됩니다. 이것은 다른 공백 문자 (예 : 문자열 및 문자 리터럴)가 이스케이프 된 형식으로 작성되어야 함을 의미합니다.
(
\047
) 또는 유니 코드 (예 :\u0027
) 이스케이프 된 문자보다\'
,\"
,\\
,\t
,\b
,\r
,\f
및\n
을 선호해야합니다.테스트를 위해 위의 규칙에 위배 될 필요가있는 경우, 테스트는 필요한 입력을 프로그램 적으로 생성 해야합니다.
패키지 선언
package com.example.my.package;
패키지 선언은 줄의 권장 최대 길이를 초과하는지 여부에 관계없이 줄 줄 바꿈을해서는 안됩니다.
문 가져 오기
// First java/javax packages
import java.util.ArrayList;
import javax.tools.JavaCompiler;
// Then third party libraries
import com.fasterxml.jackson.annotation.JsonProperty;
// Then project imports
import com.example.my.package.ClassA;
import com.example.my.package.ClassB;
// Then static imports (in the same order as above)
import static java.util.stream.Collectors.toList;
가져 오기 문을 정렬해야합니다 ...
- ... 비 정적 / 정적 및 정적이 아닌 가져 오기를 주로 사용합니다.
- ... 다음 순서에 따라 패키지 원점에 의해 부차적으로
- 자바 패키지
- javax 패키지
- 외부 패키지 (예 : org.xml)
- 내부 패키지 (예 : com.sun)
- ... 패키지와 클래스 식별자에 의한 3 차적 사전 적 순서
가져 오기 문은 줄의 권장 최대 길이를 초과하는지 여부에 관계없이 줄 줄 바꿈을해서는 안됩니다.
사용하지 않은 수입품은 없어야합니다.
와일드 카드 가져 오기
- 와일드 카드 가져 오기는 일반적으로 사용되지 않아야합니다.
- 밀접하게 관련된 클래스를 많이 가져올 때 (예 : 수십 가지의 "노드"클래스가있는 트리를 통해 방문자를 구현하는 경우) 와일드 카드 가져 오기가 사용될 수 있습니다.
- 어떤 경우에도 파일 당 두 개 이상의 와일드 카드 가져 오기를 사용해야합니다.
클래스 구조
반원들의 순서
반원은 다음과 같이 주문해야한다.
- 필드 (공개, 보호 및 비공개 순서)
- 생성자
- 팩토리 메소드
- 다른 방법 (공개, 보호 및 개인 순서)
필드 및 메소드를 주로 액세스 수정 자 또는 식별자로 정렬 할 필요는 없습니다.
다음은이 주문의 예입니다.
class Example {
private int i;
Example(int i) {
this.i = i;
}
static Example getExample(int i) {
return new Example(i);
}
@Override
public String toString() {
return "An example [" + i + "]";
}
}
반원들의 그룹화
- 관련 필드는 함께 그룹화되어야합니다.
- 중첩 형식은 처음 사용되기 바로 전에 선언 될 수 있습니다. 그렇지 않으면 필드 앞에 선언되어야합니다.
- 생성자와 오버로드 된 메소드는 기능별로 그룹화되어야하며 증가하는 방식으로 정렬되어야합니다. 이는 이러한 구성 요소 중 위임이 코드에서 아래로 흐른다는 것을 의미합니다.
- 생성자는 다른 멤버없이 그룹으로 묶어야합니다.
- 오버로드 된 메서드의 변형은 다른 멤버없이 그룹화해야합니다.
수정 자
class ExampleClass {
// Access modifiers first (don't do for instance "static public")
public static void main(String[] args) {
System.out.println("Hello World");
}
}
interface ExampleInterface {
// Avoid 'public' and 'abstract' since they are implicit
void sayHello();
}
수정 자 순서는 다음과 같습니다.
- 접근 수정 자 (
public
/private
/protected
) -
abstract
-
static
-
final
-
transient
-
volatile
-
default
-
synchronized
-
native
-
strictfp
- 접근 수정 자 (
수정자가 암시적일 때 작성하지 않아야합니다. 예를 들어 인터페이스 메소드는
public
이나abstract
로 선언해서는 안되며 중첩 된 enum과 인터페이스는 static으로 선언해서는 안됩니다.메서드 매개 변수와 로컬 변수는 가독성을 높이거나 실제 디자인 결정을 문서화하지 않으면
final
으로 선언해서는 안됩니다.필드를 변경 가능하게하는 강력한 이유가 없으면 필드를
final
선언해야합니다.
톱니 모양
- 들여 쓰기 레벨은 4 칸 입니다.
- 들여 쓰기에는 공백 문자 만 사용할 수 있습니다. 탭이 없습니다.
- 빈 줄을 들여 쓰면 안됩니다. (이것은 후행 공백 규칙이 함축하고 있음을 의미합니다.)
-
case
행은 4 개의 공백으로 들여 쓰기되어야하고 case 내의 명령문은 다른 4 개의 공백으로 들여 쓰기되어야합니다.
switch (var) {
case TWO:
setChoice("two");
break;
case THREE:
setChoice("three");
break;
default:
throw new IllegalArgumentException();
}
연속 줄을 들여 쓰는 방법에 대한 지침은 줄 바꿈 문장 을 참조하십시오.
문장 배치
소스 코드와 주석은 일반적으로 줄당 80자를 넘지 않아야하며 드문 경우 들여 쓰기를 포함하여 줄당 100자를 넘지 않아야합니다.
글자 수 한도는 사례별로 결정해야합니다. 정말로 중요한 것은 의미 론적 "밀도"와 가독성입니다. 선을 그리기가 길게 만드는 것은 읽기가 어렵습니다. 비슷하게, "영웅적 시도"를하여 80 열에 맞추어 읽을 수도 있습니다. 여기서 설명하는 유연성은 개발자가 모니터 영역의 사용을 극대화하지 않고 이러한 극한 상황을 피할 수있게하는 것을 목표로합니다.
URL 또는 예제 명령은 랩핑되어서는 안됩니다.
// Ok even though it might exceed max line width when indented.
Error e = isTypeParam
? Errors.InvalidRepeatableAnnotationNotApplicable(targetContainerType, on)
: Errors.InvalidRepeatableAnnotationNotApplicableInContext(targetContainerType));
// Wrapping preferable
String pretty = Stream.of(args)
.map(Argument::prettyPrint)
.collectors(joining(", "));
// Too strict interpretation of max line width. Readability suffers.
Error e = isTypeParam
? Errors.InvalidRepeatableAnnotationNotApplicable(
targetContainerType, on)
: Errors.InvalidRepeatableAnnotationNotApplicableInContext(
targetContainerType);
// Should be wrapped even though it fits within the character limit
String pretty = Stream.of(args).map(Argument::prettyPrint).collectors(joining(", "));
더 높은 구문 수준의 줄 바꿈은 더 낮은 구문 수준의 줄 바꿈보다 선호됩니다.
한 줄에 최대 하나의 문장이 있어야합니다.
연속 줄은 다음 네 가지 방법 중 하나에서 들여 쓰기되어야합니다.
- 변형 1 : 이전 줄의 들여 쓰기를 기준으로 8 개의 추가 공백이 있습니다.
- 변형 2 : 줄 바꿈 된 식의 시작 열에 상대적인 여덟 개의 여분의 공백이 있습니다.
- 변형 3 : 이전 형제 표현식으로 정렬 (계속 줄임을 분명히하는 한)
- 변형 4 : 체인 식의 이전 메소드 호출로 정렬.
배치 방법 선언
int someMethod(String aString,
List<Integer> aList,
Map<String, String> aMap,
int anInt,
long aLong,
Set<Number> aSet,
double aDouble) {
…
}
int someMethod(String aString, List<Integer> aList,
Map<String, String> aMap, int anInt, long aLong,
double aDouble, long aLong) {
…
}
int someMethod(String aString,
List<Map<Integer, StringBuffer>> aListOfMaps,
Map<String, String> aMap)
throws IllegalArgumentException {
…
}
int someMethod(String aString, List<Integer> aList,
Map<String, String> aMap, int anInt)
throws IllegalArgumentException {
…
}
- 메서드 선언은 인수를 세로로 나열하거나 새 줄과 +8 여분의 공백으로 형식을 지정할 수 있습니다
- throws 절을 래핑해야 할 경우 throws 절 앞에 줄 바꿈을 넣고 함수 선언과 관련하여 +8을 들여 쓰기하거나 앞의 행과 관련하여 +8을 사용하여 인수 목록에서 돋보이게하십시오.
표현식 감싸기
- 한 줄이 최대 글자 수 제한에 가까워지면 줄을 줄 바꿈하지 않고 항상 여러 문 / 표현으로 나누는 것이 좋습니다.
- 연산자 전에 해체.
- 전에 쉬십시오. 체인 방식의 호출.
popupMsg("Inbox notification: You have "
+ newMsgs + " new messages");
// Don't! Looks like two arguments
popupMsg("Inbox notification: You have " +
newMsgs + " new messages");
공백
세로 공백
하나의 빈 줄을 분리하는 데 사용해야합니다 ...
- 패키지 선언
- 클래스 선언
- 생성자
- 행동 양식
- 정적 이니셜 라이저
- 인스턴스 이니셜 라이저
...의 논리 그룹을 분리하는 데 사용될 수 있습니다.
- 수입 명세서
- 전지
- 성명
여러 연속 빈 줄은 표준 구성원 간 간격이 아닌 관련 구성원 그룹을 구분하는 데에만 사용해야합니다.
가로 공백
하나의 공간이 사용되어야합니다 ...
- 인접한 대괄호 및 중괄호에서 키워드를 분리하려면
- lambda 표현식의 화살표와 향상된 for 루프의 콜론 (예 : 레이블의 콜론 앞에 표시되지 않음)과 같은 모든 2 진 연산자와 연산자 앞뒤에 연산자가 있습니다.
-
//
다음에 주석을 시작합니다. - 쉼표를 사용하여 for 루프의 부분을 분리하는 인수와 세미콜론을 구분합니다.
- 캐스트의 닫는 괄호 뒤에.
변수 선언에서는 유형과 변수를 정렬하지 않는 것이 좋습니다.
변수 선언
- 선언 당 하나의 변수 (한 줄에 최대 하나의 선언)
- 배열의 대괄호는 변수 (
String args[]
)가 아닌 유형 (String[] args
)이어야합니다. - 로컬 변수를 처음 사용하기 전에 선언하고 가능한 한 선언에 가깝게 초기화하십시오.
특수 효과
선언 어노테이션은 어노테이션 된 선언과는 별도의 행에 두어야합니다.
@SuppressWarnings("unchecked")
public T[] toArray(T[] typeHolder) {
...
}
그러나 한 줄짜리 메소드에 주석을 달아주는 짧은 주석이나 짧은 주석은 가독성을 향상 시키면 메소드와 동일한 행에 넣을 수 있습니다. 예를 들어 다음과 같이 쓸 수 있습니다.
@Nullable String getName() { return name; }
일관성과 가독성을 위해 모든 주석을 같은 줄에 넣거나 각 주석을 별도의 줄에 넣어야합니다.
// Bad.
@Deprecated @SafeVarargs
@CustomAnnotation
public final Tuple<T> extend(T... elements) {
...
}
// Even worse.
@Deprecated @SafeVarargs
@CustomAnnotation public final Tuple<T> extend(T... elements) {
...
}
// Good.
@Deprecated
@SafeVarargs
@CustomAnnotation
public final Tuple<T> extend(T... elements) {
...
}
// Good.
@Deprecated @SafeVarargs @CustomAnnotation
public final Tuple<T> extend(T... elements) {
...
}
람다 식
Runnable r = () -> System.out.println("Hello World");
Supplier<String> c = () -> "Hello World";
// Collection::contains is a simple unary method and its behavior is
// clear from the context. A method reference is preferred here.
appendFilter(goodStrings::contains);
// A lambda expression is easier to understand than just tempMap::put in this case
trackTemperature((time, temp) -> tempMap.put(time, temp));
- 식 람다는 단일 행 블록 람다보다 선호됩니다.
- 메서드 참조는 일반적으로 람다 식보다 선호됩니다.
- 바운드 인스턴스 메서드 참조 또는 1보다 큰 arity를 가진 메서드의 경우 람다 식은 이해하기 쉽고 따라서 선호 될 수 있습니다. 특히 메서드의 동작이 컨텍스트에서 명확하지 않은 경우
- 매개 변수 유형은 가독성을 향상시키지 않으면 생략해야합니다.
- 람다식이 몇 줄 이상 뻗어 있다면 메서드를 만드는 것을 고려하십시오.
중복 된 괄호
return flag ? "yes" : "no";
String cmp = (flag1 != flag2) ? "not equal" : "equal";
// Don't do this
return (flag ? "yes" : "no");
- 중복성 그룹 괄호 (예 : 평가에 영향을주지 않는 괄호)는 가독성을 높이기 위해 사용될 수 있습니다.
- 중복 그룹화 괄호는 일반적으로 일반 연산자가 포함 된 짧은 표현에서는 제외해야하지만 긴 표현식이나 괄호없이 우선 순위와 결합이 불분명 한 연산자가 포함 된 표현식에는 포함되어야합니다. 사소한 조건을 가진 삼항 식은 후자에 속한다.
-
return
키워드 다음의 전체 식은 괄호return
묶지 않아야합니다.
리터럴
long l = 5432L;
int i = 0x123 + 0xABC;
byte b = 0b1010;
float f1 = 1 / 5432f;
float f2 = 0.123e4f;
double d1 = 1 / 5432d; // or 1 / 5432.0
double d2 = 0x1.3p2;
-
long
리터럴은 대문자L
접미사를 사용해야합니다. - 16 진수 리터럴은 대문자
A
-F
사용해야합니다. - 다른 모든 접두어, 접미사 및 접미사는 소문자로 사용해야합니다.
바지 멜빵
class Example {
void method(boolean error) {
if (error) {
Log.error("Error occurred!");
System.out.println("Error!");
} else { // Use braces since the other block uses braces.
System.out.println("No error");
}
}
}
여는 중괄호는 현재 줄의 끝 부분에 배치해야합니다.
블록이 비어 있지 않은 한 닫는 중괄호 앞에 새로운 줄이 있어야합니다 (아래의 간단한 양식 참조).
중괄호는 한 줄로 된 if 및 loop 본문과 같이 언어가 선택적으로 만드는 경우에도 권장됩니다.
- 블록이 주석을 포함하여 둘 이상의 행에 걸쳐 있으면 중괄호가 있어야합니다.
-
if
/else
문의 블록 중 하나에 중괄호가if
다른 블록도 반드시 있어야합니다. - 블록이 둘러싸는 블록의 마지막에 오는 경우에는 중괄호가 있어야합니다.
do…while
루프의else
,catch
및while
키워드는 앞의 블록의 닫는 중괄호와 같은 줄에 있습니다.
짧은 형태
enum Response { YES, NO, MAYBE }
public boolean isReference() { return true; }
위의 권장 사항은 균일 성을 향상시키기위한 것입니다 (따라서 친숙도 / 가독성을 높일 수 있습니다). 위의 가이드 라인을 벗어나는 "짧은 양식"이 읽기 쉽고 대신 사용될 수있는 경우도 있습니다. 이러한 경우에는 간단한 enum 선언 및 사소한 메서드 및 람다식이 포함됩니다.