2013-02-08 2 views
3

스윙을 사용하는 자바 프로그램에 dbus 함수를 추가하려고합니다. 스크립트를 사용하여 일부 기능을 수행 할 수 있습니다. 이 작업은 dbus를 사용할 수없는 Windows에서도 실행해야합니다.조건부 가져 오기

dbus.java :

import dbus; //Whatever the module is called 
class dbus implements some_interface { 
    //blah blah 
} 

dbus_fake.java

class dbus_fake implements some_interface { 
    //full of empty methods 
} 

dbus_manager.java

,369

그래서 나는 다음을 수행 생각하고 있었는데
class dbus_manager { 
    static some_interface get_dbus() { 
     try { 
      return new dbus(); //This should fail when loading the class, because the imports are not satisfied. 
     } except { 
      return new fake_dbus(); 
     } 
    } 
} 

당신은 그것이 좋은 생각이라고 생각합니까? 작동할까요? 그것을하는 더 좋은 방법이 있습니까?

+1

별도의 병에 보관하면 확실히 작동합니다. 응용 프로그램 용으로 하나의 인터페이스가 들어 있습니다. 각기 다른 플랫폼을위한 항아리. 단순히 플랫폼의 항아리를 classpath와 voila에 놓으십시오. –

+1

프로젝트가 매우 커질 경우 Spring과 같은 Dependency Injection 프레임 워크를 살펴 보는 것이 좋습니다. 그들은 특정 인터페이스 구현이 실제로 코드에 주입되도록 관리하기 위해 특성 파일을 사용합니다. 그런 다음 각 운영 체제에 대해 별도의 등록 정보 파일을 가질 수 있습니다. –

답변

7

안타깝게도 (현재 사용 사례에 따라 다를 수 있지만) 생성자를 사용하여 ClassNotFoundException 초를 보내는 것은 다소 신뢰할 수 없습니다.

class DBusManager { 
    static SomeInterface getDBus() { 
     try { 
      return Class.forName("your.pkg.RealDBus") 
         .getConstructor() 
         .newInstance(); 
     } catch(ClassNotFoundException e) { 
      return new FakeDBus(); 
     } 
    } 
} 
+0

나는 의사 코드에 대해 좋은 이름을 생각하기에는 너무 게으른 편이었다. 어쩌면 반성은 좋은 생각 일 수 있습니다. – LtWorf

1

왜 그렇게 어려운 :;

좀 더 신뢰할 수있는 행동 Class.forName를 사용하여 클래스를로드 할 것이다 (같은 시간에 더 많은 자바 틱 이름을 사용)? 각 플랫폼마다 별도의 jar 파일을 유지하기 만하면됩니다. 그것은 종속성이 더 많이 만들고,

windows-dbus.jar 
| 
+- class DBus implements SomeInterface { fake code } 


linux-dbus.jar 
| 
+- class DBus implements SomeInterface { real dbus code } 

당신이에있어 플랫폼에 따라 ... 등, 새로운 구현으로 확장, 별도로 유지 보수가 용이, 클래스 패스에 적절한 항아리를 포함한다. 그리고 프로그램에서 DBus의 새 인스턴스를 요청하십시오.

final SomeInterface bus = new DBus(); 

프로그램이 WebStart와 함께 배포되면 jar이 어떤 플랫폼을 대상으로하는지 언급 할 수도 있습니다.

+0

여러개의 jar 파일을 배포하는 것은 지옥이다. – LtWorf

+0

물론 그것은 개인적인 취향의 문제입니다. :-)하지만 ant를 사용하여 OS 종속 클래스 경로를 쉽게 만들 수 있습니다. http://stackoverflow.com/questions/453170/using-ant-to-detect-os-and-set-property –

관련 문제