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.