2012-10-29 7 views
8

C#의 확장 메서드는 구문 설탕을 추가하는 데 적합합니다. Java 확장 메소드는 라이브러리 개발자가 인터페이스에 메소드를 추가 할 수있게 해줍니다.Java는 비 라이브러리 개발자가 확장 메서드를 사용할 수있는 방법을 제공합니까?

나는 라이브러리가 아닌 Java 개발자로서 라이브러리에서 새로운 기능을 얻는 데 많은 이점을 얻을 것이라고 생각하지만 여전히 C# 확장 메서드의 구문 설탕 기능을 갖고 싶어합니다.

이 문제가 발생합니까 아니면 향후 Java 버전에서 가능합니까?

예 : 나는

String data = StringUtils.capitalize("abcd"); // instead of this 
String data = "abcd".capitalize() // I would like to do this 

이 특정 예에 초점을하지 마십시오, 나는 단지 내가 할 수 있도록하려는 기능의 클래스를 보여주는입니다 ... String 클래스에 메소드를 추가하고 싶습니다 이루다.

+0

Java는 이러한 방식으로 확장 클래스에 "필사자"를위한 메커니즘을 가지고 있지 않습니다. 특정 디버깅 도구로 재생할 수있는 몇 가지 트릭이 있지만 디버그 시나리오 외부에서 사용하기위한 것은 아닙니다. –

+1

일반적으로 "라이브러리 개발자"와 "응용 프로그램 개발자"(적어도 Java 세계에서는) 사이에는 단단한 경계가 없습니다. 특정 기능을 라이브러리에 사용할 수있는 경우 응용 프로그램에서도 사용할 수 있습니다. 물론 일부 기능의 복잡성으로 인해 라이브러리에서 더 많이 사용 될 수 있습니다. 예를 들면 : 복잡한 시나리오에서 제네릭을 잘 사용하는 * 쓰기 API는 매우 어렵 기 때문에 대개 (재사용 가능한) 라이브러리에서만 수행됩니다. * API를 사용하는 것이 훨씬 쉽습니다 (API가 잘 설계된 경우). –

답변

5

Java에는이 기능이 없으며 곧 사용할 수있는 가능성이 없습니다.

Groovy 그러나 very similar feature이 있으며 JVM에서도 실행됩니다. 아마 그것이 옵션입니다.

+0

감사합니다. 나는 몇 년 전 Groovy를 시험해 보았는데 (Java 7 이전), 너무 느리다. 내 코드를 더 잘 만들지 않아도 작업 속도를 높일 수 있었지만 여전히 10 배 느렸다. 그래서 방금 Java로 다시 전환했습니다. Groovy가 Java보다 10 배 더 느리고 10 배 더 많은 하드웨어를 가질 여유가 없다는 것을 읽은 것 같습니다. –

+0

@BobThule : Groovy의 속도가 빨라졌고 재미있게도 Java 7이 큰 역할을했습니다 (invokedynamic을 통해). –

2

기본 구현을 사용하여 인터페이스에 메소드를 추가 할 수 있도록 Java 8에 대한 계획을 추가한다고 생각합니다. 기존 코드를 모두 깨지 않고 새 메소드를 추가 할 수 있습니다. 이는 인터페이스 유형을 제어하는 ​​경우에만 사용하기 때문에 String은 인터페이스가 아니기 때문에 String에는 사용하지 않아야합니다.

+0

안녕하세요 루이스입니다. 그렇지만 C#의 확장 메서드를 사용하면 클래스에 메서드를 추가 할 수 있습니다.이 코드는 구문 론적 설탕 일 뿐이지 만 코드를 완성시키는 데 도움이되며 코드 완성 기능을 사용하면 메서드를 더 빨리 개발할 수 있습니다. JDK 개발자는 처음에 C#에서 Java 확장 메서드를 모델링했지만 개발자가 직면 한 문제 라이브러리를 해결하지 못했음을 알았고 현재의 기능으로 변모 시켰습니다. 이는 정말 훌륭한 솔루션이지만 특히 최종 개발자가 코드를 깔끔하게 만들 때 유용하지는 않습니다. –

+0

어. 필자는 개인적으로 Java 사람들이 Java 8 확장 메서드에 대한 제한 사항을 선호합니다. 라이브러리 디자이너라고 말하면 최종 개발자가 형식에 임의의 메서드를 추가 할 수 있다는 느낌이 너무 혼탁합니다. –

+0

자바 8 확장 메서드가 훌륭하다고 생각하며 기능을 잃지는 않을 것입니다. 그것은 우선적 인 일이며 유틸리티 클래스에서 벗어난 정적 메서드에 대한 호출을 많이 원한다면 내가 틀렸다는 말을하지는 않겠지 만, 내 개체에 직접 메서드를 호출하는 것을 선호합니다.더 깨끗하고 읽기 쉽고 객체 지향적 인 것처럼 보입니다. 그리고 mixins/traits/extension 메서드를 사용할 수있는 대부분의 다른 언어에서 Java를 사용하여 동일한 작업을 수행 할 수 있기를 바랍니다. 더 풍부한 멤버 메소드가없는 String은 무엇입니까? 특히 마지막 수업 이니까요? –

관련 문제