2011-08-01 5 views
0

다양한 메시지를 콘솔에 인쇄하는 클래스가 있는데이 클래스를 ConsoleMessages.java로 호출 할 수 있습니다. 이 클래스는 public 및 abstract이며 모든 메서드는 public 및 static입니다.조언이 필요합니다 : 자바 인터페이스의 정적 메소드

이 클래스에 대한 인터페이스를 만들고 싶습니다. PrintMessages를 호출 할 수 있습니다. 즉, ConsoleMessages.java는 PrintMessages를 구현합니다.

사실, JAVA는 인터페이스에서 정적 메소드를 지원하지 않습니다.

내가 무엇을 할 것이라고 조언 했습니까?

+1

인터페이스에서 정적 메서드를 원한다고 생각하는 이유는 무엇입니까? 성취하려는 것을 설명하십시오. –

+0

당신은 거꾸로 돌아가고 있습니다. 인터페이스를 정의한 다음 기능을 구현하십시오. 당신이하고있는 것은 모든 종류의 소리를 내고 장기적으로는 매우 시용 성이 있거나 유지 관리가 쉽지 않습니다. 성취하려는 것은 무엇입니까? 대체 디자인을 추천 할 수 있습니다. –

+0

클래스에있는 인스턴스를 호출하지 않기 때문에 정적 메서드가 인터페이스에 있어야한다고 생각하지 않습니다. – MByD

답변

0

유틸리티 클래스에 인터페이스를 정의해야하는 경우 디자인 선택을 다시해야 할 때가 있습니다. 귀하의 ConsoleMessages 클래스는 '일반적인 유틸리티 기능'을위한 덤프 그라운드로서 처음 사용 된 것보다 성장한 것 같습니다.

짧은 답변? 리팩토링 시간.

3
  • 원하는 방법으로 PrintMessages 인터페이스를 생성하십시오.

  • ConsoleMessages을 해당 인터페이스를 구현하는 클래스로 지정하십시오. 모든 메소드를 정적에서 비 정적으로 변경하십시오.

  • ConsoleMessages 인스턴스화를 singleton으로 시행하십시오. 이것은 여러 가지 방법으로 달성 할 수 있습니다. 직접 또는 Dependency Injection framework을 사용하십시오.

1

인터페이스의 정적 메소드에 대한 강박 논쟁은 실제로 없습니다. 나쁜 일은 없을 것입니다.

인터페이스에는 정적 필드와 정적 멤버 클래스가있을 수 있습니다. 따라서 하나의 추가 간접 참조로 인해 정적 메서드를 통해 정적 메서드를 연결할 수 있습니다.

interface MyService 

    static public class Factory 
     static public MyService get(...) 
      return ...; 

MyService service = MyService.Factory.get(args); 
+0

이 접근 방식의 장점은 인터페이스를 구현하여 정적 가져 오기의 효과를 얻을 수 있다는 것입니다. 정적 가져 오기를 사용하는 것보다이 방법을 사용하는 이점은 가져 오기가 전체 컴파일 단위에 영향을 미친다는 것입니다. 이와는 대조적으로이 접근법은 최상위 클래스 내에 중첩 된 개인 클래스 일 수있는 하나의 클래스에만 영향을줍니다. – emory

+0

Java와 .NET 모두 특정 인터페이스로 작업 할 목적으로 전적으로 존재하는 메소드가 다른 클래스의 정적 멤버가되어야하는 경우가 많습니다. 인터페이스 자체의 멤버. 자바 8은 아직 사용하지는 않았지만, 개선 될 것이라고 생각합니다. – supercat

0

인터페이스 (후 어떤 클래스에 의해 구현 될 것이다) 개체위한 방법이 지정한다. 여기에 객체가 없으므로 인터페이스가 필요하지 않습니다.

정적 메서드는 정확한 클래스 이름 (또는 일부 하위 클래스의 이름)을 사용해야 만 호출 할 수 있으며 인터페이스를 사용하여이 작업을 수행 할 필요는 없습니다.

  • 것은 멀리 인터페이스를 던져 정적 방법과 유지 :

    그래서, 당신은 두 가지 옵션이 있습니다.

  • 모든 메소드 (또는 적어도 인터페이스에 있어야하는 메소드)를 비 정적으로 구현하고 구현 클래스를 비 추상화하십시오. 클래스를 호출하려면 클래스의 객체가 필요합니다 (이 인터페이스 구현).
관련 문제