2011-12-06 3 views
8

인터페이스의 일부인 String.indexOfCharSequence으로 만들 때 어떤 단점도 볼 수 없습니다. 이점은 StringBuffer 또는 StringBuilder와 같은 다른 클래스도 indexOf 메서드를 구현해야한다는 것입니다.String.indexOf 메서드가 CharSequence 인터페이스의 일부가 아닌 이유는 무엇입니까?

indexOfString의 일부분이어야하는 설계상의 이유가 있습니까?

감사합니다.

+0

그래서 당신이 묻는 것은 : 왜'CharSequence'는'indexOf' 메소드를 가지고 있지 않습니까? –

+1

StringBuffer 및 StringBuilder에는 indexOf 메서드가 있지만 ... – Thilo

+0

@Thilo - CharSequence에서 해당 동작을 지정하지 않는 이유는 무엇입니까? (java.nio.CharBuffer와 javax.swing.text.Segment는'indexOf'를 구현하지 않지만 쉽게 할 수 있습니다.) –

답변

7

나는이 이유가 무엇인지 모르지만 나는 CharSequence을 구현하는 클래스의 예제를 제공 할 수있다. java.nio.CharBuffer입니다.

루프에서 charAt()을 호출하여 이론적으로 indexOf()을 구현할 수 있습니다. 그러나 사용자가 예상하는대로 작동하지 않습니다. 우리는 두 가지 상황을 구별 할 수 없습니다. 캐릭터는 아직 존재하지 않으며 캐릭터는 존재하지 않으며 거기에 없을 것입니다. 두 번째 경우 indexOf()은 계약에 의해 -1을 반환해야합니다. 첫 번째 경우 모든 바이트가 도착할 때까지 기다려야합니다. 그러나 CharBuffer는 논 블로킹 IO에 속하므로 차단할 수 없습니다.

나는 이것이 가능한 이유 중 적어도 하나를 설명한다고 생각합니다.

는 편집 :

이 @Pacerier으로 매우 가치있는 의견에 따라 나는 다음을 추가합니다. IMHO CharSequence은 다양한 상황에서 사용되는 매우 일반적인 인터페이스입니다. 이 인터페이스의 가장 잘 알려진 구현자는 String, StringBufferStringBuilder이며 모든 문자에 직접 액세스 할 수있는 데이터 구조의 전체 내용을 포함합니다. 그러나 일반적으로 잘못된 것입니다. java.nio.CharBuffer은 이러한 경우의 예입니다.

+0

그것은 말 앞에 카트를 넣고 있습니다. CharBuffer는 CharSequence가 아니어야하며, Indexof가 CharSequence가 아니어야한다고 주장했습니다. – Pacerier

+1

@Pacerier, 의견을 보내 주셔서 감사합니다. 희망을 갖고 말을 앞으로 움직이는 나의 대답에 더해보세요. :) – AlexR

+0

String과 StringBuilder가 구현하는 indexOf() 메서드를 제공하는 별도의 인터페이스가 있어야만 (메서드가 전달되고 indexOf()를 쉽게 호출 할 수 있음) (슬프게도) 그것의. –

3

나는 어떤 종류의 순서에 대해서도 조작이 의미가 있기 때문에 단지 감독 일 뿐이라고 생각합니다.

2

Java 8은 이러한 문제 중 일부를 해결할 수 있습니다. 인터페이스에 대한 기본 구현을 허용합니다. 예 :

interface List { 
    void sort() default Collections.sort(this); 
} 

이 추가 방법이 그 방법을 구현하는 모든 구현에 부담을주지 않고 인터페이스에 추가 할 수 있습니다.

+0

AlexR이 그의 대답에 언급 한 경우에 예를 들어'java.nio.CharBuffer'를 위해 어떻게 작동합니까? 'indexOf()'의 기본 구현은 그가 언급 한 문제를 해결하지 못합니다. – Jesper

+1

CharBuffer 또는 StringBuilder 또는 임의의 변경 가능한 객체에서 메소드를 사용하는 경우 'false false'에 대한 반환 코드가 없지만 무언가를 변경하면 true 일 수 있습니다. 데이터, 위치 또는 한도가 변경되는 등 '무언가를 변경하면'현재와 마찬가지로 '사실'일 수 있습니다. true/false는 현재있는 것을 기반으로 만 반환 할 수 있습니다. –