Java에 적용 가능한 경우 “최종”수정 자 사용 [닫기] 통해 답변이 뒷받침 될

Java에서는 모든 변수 (로컬 또는 클래스)를 선언하는 연습이 있으며 실제로는 매개 변수 final입니다.

이렇게하면 코드가 훨씬 더 장황하지만 코드를 쉽게 읽고 이해하는 데 도움이되고 의도가 명확하게 표시되어 실수를 방지 할 수 있습니다.

이것에 대한 당신의 생각은 무엇입니까?



답변

나는 그것이 좋은 코딩 스타일과 관련이 있다고 생각합니다. 물론 final어디에서나 많은 수정자를 사용하지 않고도 훌륭하고 강력한 프로그램을 작성할 수 있지만 생각할 때 …

변경 해서는 안되는final 모든 것에 추가하면 코드를 작성하는 사고 과정을 잘못 해석하거나 잘못 사용할 가능성이 좁아집니다. 그들이 이전에 불변의 것을 바꾸고 싶을 때 적어도 그것은 종을 울려 야합니다.

처음에는 final코드에서 많은 키워드 를 보는 것이 어색해 보이지만 곧 단어 자체에 대한 언급을 중단하고 간단히 생각할 것입니다. 에 (당신은 나에게서 그것을 취할 수 있습니다 😉

좋은 습관이라고 생각합니다. 나는 항상 그것을 사용하지 않고 있지만, 할 수 있고 무언가에 레이블을 붙이는 것이 합리적 final입니다.


답변

집착 :

  • 최종 필드-필드를 최종으로 표시하면 구성이 끝날 때 필드를 강제 설정하여 해당 필드 참조를 변경할 수 없습니다. 이렇게하면 필드를 안전하게 게시 할 수 있으며 나중에 읽을 때 동기화 할 필요가 없습니다. (객체 참조의 경우 필드 참조 만 변경할 수 없습니다. 객체 참조가 참조하는 항목은 계속 변경 될 수 있으며 불변성에 영향을줍니다.)
  • 최종 정적 필드-정적 최종 필드를 사용했던 많은 경우에 지금 열거 형을 사용하지만.

신중하게 사용하십시오.

  • 최종 수업-프레임 워크 / API 디자인은 내가 생각하는 유일한 경우입니다.
  • 최종 방법-기본적으로 최종 클래스와 동일합니다. 미친 것과 같은 템플릿 방법 패턴을 사용하고 물건을 최종으로 표시하는 경우 상속에 너무 의존하고 위임에 충분하지 않을 수 있습니다.

항문 느낌이 없으면 무시하십시오.

  • 메소드 매개 변수 및 로컬 변수-게으르고 코드가 복잡해지기 때문에 거의하지 않습니다. 수정하지 않을 마킹 매개 변수와 로컬 변수가 “보다 옳다”는 것을 완전히 인정합니다. 이것이 기본값이기를 바랍니다. 그러나 그렇지 않으며 코드를 결승으로 이해하기가 더 어렵다는 것을 알았습니다. 다른 사람의 코드를 사용하는 경우 코드를 꺼내지 않지만 새 코드를 작성하는 경우 코드를 넣지 않습니다. 한 가지 예외는 최종 항목을 표시하여 액세스 할 수있는 경우입니다. 익명의 내부 클래스 내에서.

답변

최종 키워드를 사용하기 전에 전체 사용법을 이해해야합니다. 변수, 필드, 메소드 및 클래스에 적용 할 수 있으며 다른 영향을 미칩니다.

자세한 내용은 아래 링크 된 기사를 확인하는 것이 좋습니다.

최종 키워드에 대한 최종 단어


답변

final특히 변수에 대한 수정은 수단 컴파일러는 일반적으로 분별하는 규칙을 적용하는 것입니다 : 확실히 (로컬 또는 인스턴스) 변수 (더 이상 아무 이하) 정확히 한 번만 할당되지도하지 않습니다. 변수를 사용하기 전에 변수를 확실히 할당하면 NullPointerException다음 과 같은 일반적인 경우를 피할 수 있습니다 .

final FileInputStream in;
if(test)
  in = new FileInputStream("foo.txt");
else
  System.out.println("test failed");
in.read(); // Compiler error because variable 'in' might be unassigned

변수가 두 번 이상 할당되지 않도록하여 범위 초과 범위를 권장하지 않습니다. 이 대신에 :

 String msg = null;
 for(int i = 0; i < 10; i++) {
     msg = "We are at position " + i;
     System.out.println(msg);
 }
 msg = null;

이것을 사용하는 것이 좋습니다.

 for(int i = 0; i < 10; i++) {
     final String msg = "We are at position " + i;
     System.out.println(msg);
 }

일부 링크 :


답변

가능한 모든 변수를 선언하는 것에 대해 독단적 final입니다. 여기에는 메소드 매개 변수, 로컬 변수 및 드물게 값 오브젝트 필드가 포함됩니다. 어디에서나 최종 변수를 선언해야하는 세 가지 주요 이유가 있습니다.

  1. 의도 선언 : 최종 변수를 선언 하여이 변수를 한 번만 작성해야한다고 말하고 있습니다. 다른 개발자에게는 미묘한 힌트이며 컴파일러에게는 큰 힌트입니다.
  2. 일회용 변수 시행 : 각 변수는 인생에서 단 하나의 목적을 가져야한다는 생각이 있습니다. 각 변수에 하나의 목적 만 부여하면 디버깅하는 동안 특정 변수의 목적을 달성하는 데 걸리는 시간이 줄어 듭니다.
  3. 최적화 허용 : 컴파일러가 변수 참조의 불변성에 특히 의존하는 성능 향상 트릭을 사용했음을 알고 있습니다. 나는이 오래된 성능 트릭 (또는 새로운 트릭) 중 일부가 컴파일러에서 사용될 것이라고 생각하고 싶습니다.

그러나 최종 클래스와 메소드는 최종 변수 참조만큼 유용하지 않다고 생각합니다. final이러한 선언과 함께 사용할 때 키워드는 단순히 자동화 된 테스트하고 예상 적이없는 수 방법으로 코드의 사용에 장애물을 제공합니다.


답변

효과적인 Java에는 “Favour immutable objects”라는 항목이 있습니다. 필드를 최종으로 선언하면이를 향한 몇 가지 작은 단계를 수행하는 데 도움이되지만 물론 그보다 불변의 객체는 훨씬 더 많습니다.

객체가 변경 불가능하다는 것을 알고 있다면 동기화 걱정없이 많은 스레드 / 클라이언트간에 읽기 위해 공유 할 수 있으며 프로그램 실행 방법에 대한 추론이 더 쉽습니다.


답변

변수에 대한 최종 키워드를 사용하면 실수를 저 지르지 못하는 상황에 처한 적이 없으므로 지금은 엄청난 시간 낭비라고 생각합니다.

실제 변수에 대한 특정 포인트를 만들고자하는 것처럼 실제 이유가 없다면 코드를 읽기 쉽기 때문에 오히려 수행하지 않을 것입니다.

그러나 코드를 읽기 어렵거나 더 길게 작성하지 못하면 꼭 사용하십시오.

편집 : 설명 (및 다운 투표를 되찾기위한 시도)로서, 상수를 최종으로 표시하지 않는다고 말하는 것이 아니라 다음과 같은 일을하지 않는다는 것입니다.

public String doSomething() {
  final String first = someReallyComplicatedExpressionToGetTheString();
  final String second = anotherReallyComplicatedExpressionToGetAnother();

  return first+second;
}

그것은 단지 내 의견으로는 코드를 읽기 어렵게 만듭니다.

또한 모든 최종 작업은 변수를 다시 할당하지 못하게하고 불변 또는 이와 유사한 것을 만들지 않는다는 것을 기억해야합니다.