다음은 각각의 오해에 대해 모든 사람에게 표시됩니다.
1. NULL의 과도한 사용
NULL의 과도한 사용을 피하는 것이 모범 사례입니다. 예를 들어, 더 나은 접근 방식은 메소드가 NULL 값 대신 빈 배열 또는 수집으로 돌아 오도록하는 것입니다. 이는 프로그램이 NULLPOINETEREXCEPTION을 던질 수 없기 때문입니다. 다음 코드 조각은 다른 방법에서 컬렉션을 얻습니다.
List <string> accountids = person.getAccountIds ();
그림에 계정이 없으면 getAccountIds ()는 NULL 값을 반환하고 프로그램은 NULLPOINTEREXCEPCE 예외를 버립니다. 따라서이 문제를 해결하기 위해 공기 점검에 참여해야합니다. 반환 된 null 값을 빈 목록으로 바꾸면 NullPointerException이 나타나지 않습니다. 또한 더 이상 변수 계정을 짧게 점검 할 필요가 없기 때문에 코드가 더 간결하게됩니다.
널 값을 피하려면 다른 시나리오가 다른 관행을 취할 수 있습니다. 한 가지 방법은 옵션 유형을 사용하는 것입니다.이 유형은 빈 객체 또는 일부 값의 패키지 일 수 있습니다.
옵션 옵션 옵션 = 옵션.
실제로 Java8은보다 간결한 방법을 제공합니다.
옵션 <String> OptionalString = Optional.ofNullable (NullialString);
Java는 Java8 버전에서 선택적인 유형을 지원했지만 기능 프로그래밍 세계에서 널리 알려져 있습니다. 그 전에는 Google Guava의 Java 초기 버전에서 사용되었습니다.
2. 이상을 무시합니다
우리는 종종 이상을 무시합니다. 그러나 모범 사례는 초보자와 숙련 된 Java 프로그래머를 위해 그들을 다루는 것입니다. 비정상적인 던지기는 일반적으로 의도적이므로 대부분의 경우 이상을 유발하는 사건을 기록해야합니다. 이 문제를 과소 평가하지 마십시오. 필요한 경우 사용자에게 오류 메시지를 표시하거나 대화 상자에 오류 메시지를 기록 할 수 있습니다. 적어도 다른 개발자들에게 원인과 결과를 알리기 위해서는 왜이 이상이 다루지 않았는지 설명해야합니다.
selfie = person.shootaselfie (); chelfie.show ();} catch (nullpointterexception e) {어쨌든 누가 신경 쓰는가?
중요하지 않은 것을 강조하는 간단한 방법은이 정보를 다음과 같이 비정상적인 변수 이름으로 사용하는 것입니다.
다음과 같이 코드 코드를 복사하십시오.
try {selfie.delete ();} catch (nullpointterexception이 중요하지 않음) {}
3. 동시에 이상을 수정하십시오
이 이상은 컬렉션 객체에서 발생하며 동시에 반복자 객체가 제공 한 메소드를 사용하여 컬렉션의 컨텐츠를 업데이트하지 않습니다. 예를 들어 여기에는 모자 목록이 있으며 귀 플랩이 포함 된 모든 값을 삭제하려고합니다.
list <ihats = new arraylist <> (); hasearflaps ()) {hats.remove (hat);}}
이 코드가 실행되면 ConcurrentModificationException이 발생합니다. 코드는이 컬렉션을 가로 지르면서 수정되므로 코드가 수정되므로 코드가 수정됩니다. 여러 프로세스가 동일한 목록에 작용하면 프로세스 중 하나가 목록을 통과 할 때 다른 프로세스는 목록 내용을 수정하려고 시도하며 동일한 이상도 발생할 수 있습니다.
다중 스레드 동시 수정 수집 컨텐츠에서 매우 일반적이므로 동시 잠금 장치, 동시 수정을위한 특수 세트 등과 같은 동시 프로그래밍에 일반적으로 사용되는 방법을 사용해야합니다. Java는이 문제를 단일 스레드 및 다중 스레드 상황에서 해결합니다.
물체를 수집하고 다른 주기로 삭제하십시오
직접 솔루션은 귀 플랩이있는 모자를 목록에 넣은 다음 다른 주기로 삭제하는 것입니다. 그러나이를 위해서는 모자를 삭제 해야하는 추가 세트가 필요합니다.
list <ihatstoremove = new LinkedList <> (ihat hats) {if (hat.hasearflaps ()) {(ihatstoremove) {hats.remov e (hat);}.
iterator.remove 메소드를 사용하십시오
이 방법은 더 간단하며 동시에 추가 컬렉션을 만들 필요가 없습니다.
iterator <ihatitrator = hats.iterator ();
Listiterator를 사용하는 방법
목록 인터페이스 모음 모음이 구현되면 목록 반복자는 매우 적합한 선택입니다. Listitoror 인터페이스를 구현하는 반복자는 삭제 작업을 지원할뿐만 아니라 ADD 및 SET 작업도 지원합니다. ListOtrator 인터페이스는 반복자 인터페이스를 구현 하므로이 예제는 반복자 제거 메소드와 유사합니다. 유일한 차이점은 모자 반복기의 유형이며, 반복자 메소드를 ListOtRator () 메소드를 사용합니다. 다음 조각은 Listterator.remove 및 ListOtrator.add 메소드를 사용하여 Ear Flaps Hat을 SOM <Ombreros로 교체하는 방법을 보여줍니다.
ihat sombero = new sombero (); ; hattenrator.add (sombrro);}}
Listiterator를 사용하여 호출 제거 및 추가 메소드를 교체하여 하나의 세트 방법 만 호출 할 수 있습니다.
ihat sombero = new sombero (); ); // 제거 및 추가 대신}}
Java 8에서 스트림 방법을 사용하십시오
Java8에서 개발자는 일부 조건에 따라 컬렉션을 스트림 및 필터 스트림으로 변환 할 수 있습니다. 이 예제는 스트림 API가 어떻게 모자를 필터링하고 동시 모형화를 피하는 방법을 알려줍니다. Hats = Hats.stream ().
다음과 같이 코드 코드를 복사하십시오.
.Collect (Collectors.tocollection (ArrayList :: new));
Collectors.tocollection 방법은 필터링 된 모자 값을 저장하는 새로운 Arraylist를 생성합니다. 필터링 조건이 많은 수의 항목을 필터링하면 여기에서 큰 배열 목록이 생성됩니다. 따라서주의해서 사용해야합니다.
Java 8의 List.removeif 메소드를 사용하십시오
Java 8 -Removeif 방법에서 더 간결하고 명확한 방법을 사용할 수 있습니다.
다음과 같이 코드 코드를 복사하십시오.
hats.removeif (ihat :: hasearflaps);
하단에서는 iterator.remove를 사용 하여이 작업을 완료하십시오.
특별 컬렉션을 사용하십시오
처음에 ArrayList 대신 CopyOnWriteAreRayList를 사용하기로 결정한 경우 아무런 문제가 없습니다. CopyonWriteArrayList는 수정 된 메소드 (예 : Set, Add, REMING)를 제공하므로 원래 컬렉션 배열을 변경하지 않지만 새 수정 된 버전을 만듭니다. 이를 통해 Traversal은 원래 버전을 수정하여 동시 모형화 외환이 발생하지 않도록합니다. 이 컬렉션의 단점은 또한 매우 명백합니다. 각 수정마다 새로운 컬렉션이 생성됩니다.
CopyonWriteset 및 ConsurenTashMap과 같은 다양한 시나리오에 적합한 다른 세트가 있습니다.
동시 수정 중에 발생할 수있는 다른 오류와 관련하여 컬렉션에서 스트림을 생성하면 백 -엔드 컬렉션이 수정됩니다. 스트림의 일반적인 기준은 스트림을 확인할 때 백 -엔드 컬렉션을 수정하는 것을 피하는 것입니다. 다음 예제는 스트림을 올바르게 처리하는 방법을 보여줍니다.
List <IHAT> FILEDHATS = HATS.STREAM (HAT-> {IF (HAT.HASEARFLAPS ()) {HATS.REMOVE (HAT);});
Peek 방법은 모든 요소를 수집하고 각 요소에 대해 확립 된 동작을 수행합니다. 여기서 조치는 기본 목록에서 데이터를 삭제하려고 시도하는 것입니다. 이러한 작업을 피하기 위해 위에서 설명한 몇 가지 방법을 시도 할 수 있습니다.
4. 방어
때로는 더 나은 협업을 위해 표준 라이브러리 또는 제 3자가 제공 한 코드는 공통 종속성을 준수해야합니다. 예를 들어, Hashcode와 해시 코드 및 동등한 메소드를 사용하는 기타 클래스의 일련의 컬렉션 클래스가 정상적으로 작동 할 수 있도록 해시 코드와 동일하게 해시 코드 간의 공동 계약을 준수해야합니다. 예외 또는 코드 컴파일과 같은 오류를 준수하지 마십시오. 위험한 프롬프트없이 언제든지 응용 프로그램 동작을 변경할 수 있습니다.
오류 코드는 생산 환경에 몰래 빠져 나와 많은 부작용이 발생할 수 있습니다. 여기에는 UI 경험 저하, 잘못된 데이터 보고서, 응용 프로그램 성능 저하, 데이터 손실 등이 포함됩니다. 다행히도 이러한 치명적인 오류는 종종 발생하지 않습니다. 해시 코드와 그에 따른 장면은 다음과 같이 언급되었습니다. 간단히 말해서, 본 계약에는 두 가지 기준이 있습니다.
두 객체가 같으면 해시 코드가 같아야합니다.
두 객체의 해시 코드가 동일한 경우 동일하거나 다를 수 있습니다.
파괴에 대한 첫 번째 기준, 해시 맵에서 데이터를 검색하려고하면 오류가 발생합니다. 두 번째 기준은 동일한 해시 코드를 가진 객체가 반드시 같을 필요는 없음을 의미합니다.
첫 번째 기준을 파괴 한 결과를 살펴 보겠습니다.
공개 정적 클래스 보트 {개인 문자열 이름 (문자열 이름) {this.name =} @override public o) {if (this == o) tole (o == null || getClass ()! int hashcode () {return (int) (math.random () * 5000);}}
보시다시피, 보트 클래스는 평등 및 해시 코드 메소드를 다시 작성합니다. 그러나 해시 코드가 각 호출에 대해 동일한 오브젝트에 대한 임의 값을 반환했기 때문에 계약을 파괴했습니다. 다음 코드는 해시 세트에서 Enterprise라는 보트를 찾지 못할 가능성이 있지만 실제로는이 유형의 보트를 미리 추가했습니다.
public static void main (string [] args) {set <goat> 보트 = New Hashset <> (); Add ( "Enterprise"); Ed 'Enterprise': %b/n ", 보트. (새 보트 ( "Enterprise"));};}
또 다른 계약은 마무리 방법입니다. 다음은 기능 설명에 대한 공식 Java 문서에 대한 참조입니다.
Finalize의 기존 계약은 다음과 같습니다. JAVATM 가상 머신은 모든 스레드가 더 이상 지정된 객체에 액세스 할 수 없다고 판단하면이 방법이 특정 동작의 결과로 호출됩니다. 최종 방법은 다른 스레드에 다시 사용할 수 있도록이 객체를 사용하는 것을 포함하여 여러 기능을 가지고 있습니다. 예를 들어, 입력/출력 연결 객체를 나타내는 최종 메소드는 명시 적 I/O 트랜잭션을 실행하여 영구 폐기 된 개체 전에 연결을 방해 할 수 있습니다.
파일 프로세서에서 최종 메소드를 사용하여 리소스를 해제하기로 결정할 수 있지만이 사용법은 나쁩니다. 쓰레기 재활용 중에 호출되고 GC의 시간은 확실하지 않기 때문에 마무리 시간은 보장되지 않습니다.
5. 매개 변수화 대신 원래 유형을 사용하십시오
Java 문서 설명에 따르면 : 원래 유형은 비 회수화되지 않았거나 RM의 비 종종 멤버입니다 (또한 부모 또는 상위 인터페이스의 비 구원화). Java Generic 유형이 도입되기 전에 기본 대체 유형은 없었습니다. Java는 버전 1.5에서 일반 프로그래밍을 지원했으며 이것이 중요한 기능 개선이라는 것은 의심의 여지가 없습니다. 그러나 뒤로 호환성으로 인해 전체 유형 시스템을 파괴 할 수있는 트랩이 있습니다. 예제를 노력하십시오 :
ListOfNumbers = New ArrayList ();
이것은 원래 Arraylist로 정의 된 숫자 목록입니다. 유형 매개 변수를 지정하지 않으므로 객체를 추가 할 수 있습니다. 그러나 마지막 줄은 int 유형에 포함 된 요소를 삽입하고 2를 곱하고 데이터를 표준 출력으로 두 배로 늘린 후 데이터를 인쇄했습니다.
이 코드는 컴파일 중에 오류가 발생하지 않지만 일단 실행되면 캐릭터 유형을 성형 수술에 매핑하려고하기 때문에 실행 중에 오류가 발생합니다. 분명히 필요한 정보가 숨겨져있는 경우 유형 시스템은 보안 코드를 작성하는 데 도움이되지 않습니다.
이 문제를 해결하려면 컬렉션의 객체의 특정 유형을 지정해야합니다.
ListOfNumbers = New ArrayList <() (10);
이전 코드의 유일한 차이점은 컬렉션을 정의하는 줄입니다.
다음과 같이 코드 코드를 복사하십시오.
목록 <integer> listofnumbers = new ArrayList <();
수정 된 코드 컴파일은 예상되는 저장 플라스틱의 컬렉션에 문자열을 추가하려고하기 때문에 전달할 수 없습니다. 컴파일러는 오류 메시지를 표시하고 목록에 20자를 추가하는 줄을 가리 킵니다. 매개 변수화 일반 유형은 좋은 생각입니다. 이 경우, 컴파일러는 가능한 유형을 확인하여 불일치로 인한 런타임의 비정상적인 기회가 크게 줄어 듭니다.
위의 5 명의 Java 프로그래머의 주요 요약은 종종 실수를 저지 릅니다. 모든 사람들이 그것을 좋아할 수 있기를 바랍니다.