[java] C # 확장 메소드와 동등한 Java

확장 방법을 사용하여 C #에서와 같이 객체 목록에 기능을 구현하려고합니다.

이 같은:

List<DataObject> list;
// ... List initialization.
list.getData(id);

Java로 어떻게합니까?



답변

Java는 확장 메소드를 지원하지 않습니다.

대신 일반 정적 메서드를 만들거나 자신의 클래스를 작성할 수 있습니다.


답변

확장 메소드는 정적 메소드 일뿐 아니라 편의 구문 설탕 만이 아니라 실제로는 매우 강력한 도구입니다. 가장 중요한 것은 다른 제네릭의 매개 변수 인스턴스화에 따라 다른 방법을 재정의하는 기능입니다. 이것은 Haskell의 형식 클래스와 유사하며 실제로 C #의 Monads (LINQ)를 지원하기 위해 C #에있는 것처럼 보입니다. LINQ 구문을 삭제하더라도 Java에서 유사한 인터페이스를 구현하는 방법을 아직 모릅니다.

그리고 제네릭 매개 변수의 Java 유형 삭제 의미 때문에 Java로 구현할 수 없다고 생각합니다.


답변

Project Lombok@ExtensionMethod 은 요청한 기능을 달성하는 데 사용할 수 있는 주석 을 제공합니다 .


답변

기술적으로 C # Extension은 Java와 동등한 기능이 없습니다. 그러나보다 명확한 코드와 유지 관리 성을 위해 이러한 기능을 구현하려면 매니 폴드 프레임 워크를 사용해야합니다.

package extensions.java.lang.String;

import manifold.ext.api.*;

@Extension
public class MyStringExtension {

  public static void print(@This String thiz) {
    System.out.println(thiz);
  }

  @Extension
  public static String lineSeparator() {
    return System.lineSeparator();
  }
}


답변

XTend의 자바 소스 코드에 자바의 슈퍼 세트이며, 컴파일 – 언어 1  -이 작업을 지원합니다.


답변

매니 폴드 는 Java에 C # 스타일 확장 메소드 및 기타 여러 기능을 제공합니다. 다른 도구와는 달리, 매니 폴드에는 제한이 없으며하지 않는 고통 제네릭, 람다, IDE 등 매니 폴드와 같은 F 번호 스타일 등 여러 가지 다른 기능 제공과 함께 문제에서 사용자 정의 유형 , 타이프 라이터 스타일의 구조 인터페이스 , 자바 스크립트 스타일 의 expando 유형 .

또한 IntelliJ는 매니 폴드 플러그인을 통해 매니 폴드를 포괄적으로 지원합니다 .

매니 폴드는 github에서 사용할 수있는 오픈 소스 프로젝트 입니다.


답변

또 다른 옵션은 google-guava 라이브러리의 ForwardingXXX 클래스 를 사용하는 것 입니다.