CharSequence가 contains (CharSequence)를 정의하지 않는 이유는 무엇입니까?


11

계약이 동일하므로 이는 Java SE 및 Android 모두에 적용됩니다.

CharSequencecontains(CharSequence)메소드를 정의하지 않습니다 . 나는 그 이유를 찾을 수 없으며 그것을 포함하는 것이 매우 유용 CharSequence#toString()하여 일련의 문자를 확인하기 위해 전화 를 걸 필요가 없습니다 .

예를 들어, Android에서는 사용자가 구현 하더라도 Editable#toString()문자 시퀀스가 ​​포함되어 있는지 확인 하도록 호출해야하는데 , 정의 된 경우 피할 수 있습니다 .EditableCharSequenceCharSequencecontains(CharSequence)

이 디자인 선택의 아이디어는 무엇입니까? 잠재적 인 감독입니까, 아니면 이에 대한 설계 이유가 있습니까?

답변:


10

요점은 CharSequence문자 순서에 대한 읽기 전용보기를 제공하는 것입니다. 이 인터페이스는 문자열 조작 또는 검색 방법을 제공하지 않습니다. 그것들은 범위를 벗어납니다.

인터페이스 분리 원칙은 유형의 클라이언트가 사용하지 않는 메소드에 의존해서는 안된다고 제안합니다. 따라서 인터페이스는 최소한의 유용한 집합 만 선언해야합니다. 다른 유스 케이스에 다른 메소드가 필요한 경우 다른 인터페이스가 있어야합니다.

문자 소스 만 필요한 클라이언트에는 검색 방법이 필요하지 않습니다.

물론이 원리를 과장하고 수천 개의 작은 인터페이스로 끝날 수 있습니다. 그것도 좋지 않습니다. 따라서 CharSequence인터페이스에는 최소 charAt()및 length()메소드뿐만 아니라 깊이 관련된 편의 메소드도 포함 subSequence()됩니다. CharSequence는 문자열 복사본이없는 서브 시퀀스에 대한 뷰를 제공 할 수 있으므로 이것이 인스턴스 메소드 여야합니다. toString()이 메소드는에서 상속 받으므로 지정 해도됩니다 Object. 방법 chars()및 codePoints()적응 CharSequenceA와 Stream인터페이스를 제공합니다. 이것들은 기본 메소드이므로 구현하는 클래스에 대한 추가 요구 사항을 부과하지 않습니다 CharSequence.

이 CharSequence유형은 특정 구현을 지정하지 않고 메소드에 일반 문자 소스가 필요한 경우에 유용합니다 (예 : String vs. CharBuffer vs. StringBuilder). String#join()및 String#contains()방법은 사용의 좋은 예 CharSequence들.

외부 적으로 구현할 수 있으므로 메소드 CharSequence를 제공 할 필요가 없습니다 contains(). Java는 C #의 확장 메소드의 편리함이 없지만 정적 메소드는 본질적으로 동일합니다. 그래서 boolean Editable#contains(CharSequence needle)당신 대신 에을 가질 것 static boolean contains(CharSequence haystack, CharSequence needle)입니다. 문자열 검색 알고리즘 은 잘 연구 된 컴퓨터 과학 주제입니다. 다른 트레이드 오프를 가진 다른 알고리즘을 쉽게 사용할 수 있습니다.

더 읽을 거리 :


2
당신이 언급 " 이 인터페이스는. 사람들이 범위를 벗어나있다. 문자열 조작이나 검색 방법을 제공하지 않습니다 "하지만 contains돌연변이의 방법이 아닙니다, 거기 않는 존재의 검색 방법은 ( charAt), 그래서 이것은 어떻게 적용됩니까? 또한 " 이것은 기본 메소드이므로 CharSequence를 구현하는 클래스에 대한 추가 요구 사항을 부과하지 않습니다. "- containsimpl을 통해 기본값으로 구현할 수 없어 클래스 구현에return to String().contains(...) 대한 요구 사항이 제거 되었습니까?
— Vince Emigh

1
@VinceEmigh 예, contains()기본 방법이 될 수 있습니다. 존재하는 경우 String#contains다른 방식으로 구현해서는 안되며 String은 CharSequence 구현을 사용해야합니다. 는 charAt()다르다. 검색 알고리즘을 구현하지 않습니다. 검색 알고리즘의 중요한 부분입니다 CharSequence. 없이는 내용을 다른 유형으로 복사 할 수 없습니다 String. 스트림은 Java8의 중요한 부분이며 이러한 기본 메소드를 추가하는 것은와 같은 다른 인터페이스에 추가 된 것과 일치 Collection합니다.
— amon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.