Java 메소드 순서 규칙이 있습니까? [닫은]


159

코스 과정으로 제출할 패키지의 일부인 큰 클래스 (40 정도의 메소드)가 있습니다. 현재 유틸리티 공공 / 개인 등의 측면 에서이 방법이 상당히 혼란스럽고 합리적인 방법으로 주문하고 싶습니다. 이 작업을 수행하는 표준 방법이 있습니까? 예를 들어 일반적으로 필드는 메소드 앞에 나열되고 생성자는 다른 메소드 앞에 나열되며 getter / setter는 마지막입니다. 나머지 방법은 어떻습니까?


또한 이와 같은 코드로 작업 할 때 대부분의 IDE에서는 커서 아래에있는 모든 것에 대한 정의를 자동으로 볼 수 있습니다. 이것은 당신이 한 눈에 아무것도 할 필요가 없다는 것을 의미합니다.
Thorbjørn Ravn Andersen

단일 클래스에 40 개의 메소드가있는 경우
Ben

답변:


132

일부 규칙은 모든 공용 메소드를 먼저 나열한 다음 모든 개인 메소드를 나열합니다. 즉, 인터페이스가없는 경우에도 의미가 무엇인지 알더라도 API를 구현에서 쉽게 분리 할 수 ​​있습니다.

또 다른 아이디어는 관련 방법을 함께 그룹화하는 것입니다. 이렇게하면 기존 대형 클래스를 여러 개의 더 작고 대상이 지정된 여러 클래스로 분할 할 수있는 이음새를 쉽게 찾을 수 있습니다.


1
+1. 나는 가시성별로 정렬하는 것을 선호합니다. 부끄러운 이클립스는 자동 으로이 작업을 수행 할 수 없습니다 (항상 모든 생성자와 모든 메소드를 함께 그룹화합니다)
finnw

16
@finnw, 버그 보고서를 제출하십시오. 낯선 것들이 그곳에서 구현 된 것으로 알려져 있습니다.
Thorbjørn Ravn Andersen

3
@Ben : 제 경험은 "never"는 예외가 있다는 것입니다.
Jon Skeet

1
주문 규칙이 더 이상 관련이없는 경우는 @JonSkeet입니다. 예를 들어 클래스를 테스트하십시오. 잘못된 코드를 작성하지 않는 것이 나쁜 코드를 정렬하는 방법보다 조언하는 것이 좋습니다.
Ben

1
@Ben : 동의하지 않으면 동의해야한다고 생각합니다. 나는 관심사 등의 분리를 위반하지 않고 매우 자연스럽게 많은 멤버가있는 코드를 작성했습니다.
Jon Skeet

121
  1. 클래스 (정적) 변수 : 먼저 공개 클래스 변수, 보호 된 변수 및 개인 변수.

  2. 인스턴스 변수 : 먼저 공개, 보호 및 비공개

  3. 생성자

  4. 방법 : 이러한 방법은 범위 나 접근성보다는 기능별로 그룹화해야합니다. 예를 들어 프라이빗 클래스 메서드는 두 퍼블릭 인스턴스 메서드 사이에있을 수 있습니다. 목표는 코드를 쉽게 읽고 이해하는 것입니다.

출처 : http://www.oracle.com/technetwork/java/codeconventions-141855.html


4
이것은 15 살이며 아마도 현대적인 IDE의 모습으로 약간 구식입니다.
assylias

16
@assylias : IMO, 가독성은 IDE와 무관합니다. 개인 전에 공개하는 것이 일반적으로 좋습니다.
saurabheights

40

«코드 규칙»에 대한보다 정확한 링크 : «클래스 및 인터페이스 선언»


8
+1, afaik-이것은 실제로 질문에 답변하는 유일한 게시물입니다. 예. Oracle 및 Sun에서 명시한 표준 순서가 있습니다. 1. 공개 의견, 2. 클래스, 3. 내부 의견, 4. 정적 데이터, 5. 인스턴스 데이터, 6. ctors, 7. 메소드 및 각 섹션 그룹 접근성에 의한 것이 아니라 논리적으로
존 헨켈

@VadimKirilchuk«인터넷 아카이브»가 다운…
Timofey Gorshkov


15

보편적으로 인정되는 표준이 있는지는 확실하지 않지만 제 자신의 선호는 다음과 같습니다.

  • 먼저 생성자
  • 정적 메소드 다음, 항상 메인 메소드가있는 경우 항상 다른 정적 메소드 앞에
  • 다음은 일반적으로 메소드의 중요성 순서에 따라 정적 메소드가 아닌 메소드를 호출합니다. 이것은 다른 클래스 메소드를 호출하는 퍼블릭 메소드가 맨 위에 표시되고 다른 메소드를 호출하지 않는 개인 메소드는 일반적으로 맨 아래로 표시됨을 의미합니다.
  • 표준 방법 좋아 toString, equals하고 hashcode다음
  • 게터와 세터는 수업 하단에 특별한 장소가 있습니다.

제대로 작성된 생성자는 속성에 인수를 할당하는 것 외에는 다른 작업을 거의 수행하지 않기 때문에 생성자를 마지막으로 선호합니다.
GordonM

@GordonM 왜 그렇게 생각하십니까? 나는 그 반대가 사실이라고 주장하기까지 갈 것이다. 항상 클래스에 가장 깨끗한 API를 생각해야합니다. 그리고 그것은 종종 그들이 저장되는 방식이 아니므로, 나는 종종 호출자를이 부담으로부터
Neuron

@ GordonM 부작용에 대해 이야기하고 있지 않습니다. 따라서 전달 된 목록이나 비슷한 항목은 변경되지 않습니다. 그냥 전달하고 값을 설정하면 클래스의 경우 안 그것의 구현에 대해 많이 알 것을 요구한다
신경 세포

@LonelyNeuron 여기서 무슨 말을하는지 잘 모르겠지만 생성자가 인수를 내부 상태에 할당하는 것 외에 많은 설정 작업을 수행해야한다고 말하는 것 같습니다. 이것은 "마법"에 의해 일이 일어나고 있음을 의미하기 때문에 가장 잘못되었습니다. 호출 new Thing()하면 새로운 Thing이 인스턴스화됩니다. 데이터베이스 연결이 열리거나 파일이 작성되는 등의 결과를 초래해서는 안됩니다.
GordonM

@LonelyNeuron 생성자에 종속성이 있다고해서 클래스의 구현에 대한 의존성 외에 다른 것을 알려주지는 않습니다. 이것은 나쁜 것이 아니라 좋은 것입니다.
GordonM

12

하나의 클래스에서 40 개의 메소드는 약간 많다.

기능 중 일부를 다른 적절한 클래스로 옮기는 것이 합리적입니까? 그렇다면 이해하기가 훨씬 쉽습니다.

수가 적을수록 자연스럽게 읽는 순서대로 나열하는 것이 훨씬 쉽습니다. 빈번한 패러다임 중 하나를 목록 것들입니다 전에 또는 후에 당신은 당신이 그들을 필요로하는 순서를해야합니다.

이것은 일반적 main()으로 상단 또는 하단에 있음을 의미합니다 .



4
예를 들어 많은 메소드로 인터페이스를 구현하는 경우 항상 선택할 수있는 것은 아닙니다.
finnw

5
이 때문에 단순히 다른 곳 갈 수 없어 많이있다, 안드로이드 활동 onPause(), onResume()등 내 모든뿐만 아니라, OnClickListener그들이 필드가 있지만, 모양 또는가 합리적인 그래서 그들처럼 행동하지 않는, 필드, 별도로 나열하십시오.
Fredley

@finnw, 추상 클래스는이 목적을 위해 훌륭하고 사용 가능합니다.
Thorbjørn Ravn Andersen

11

내 "컨벤션": 인스턴스 앞에 정적, 개인 앞에 공개, 메서드 앞에 생성자, 맨 아래에 기본 메서드 (있는 경우).



1

Eclipse를 사용하고 있습니까? 그렇다면 기본 멤버 정렬 순서를 고수 할 것입니다. 왜냐하면 코드를 읽는 사람에게 가장 친숙하기 때문입니다 (내가 가장 좋아하는 정렬 순서는 아니지만).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.