5

두 Eclipse 프로젝트에서 사용하고있는 모델 클래스 (MVC pattern)가 있습니다.Eclipse 프로젝트에서 공유되는 클래스의 패키지 전용 필드에 액세스

하나의 프로젝트는 Producer이라고하며 스트림에서 데이터를 캡처하여 데이터베이스에 저장하고 있습니다. 문제의 모델 클래스, 예를 들어 ObjectModel은 직렬화 및 DB에 저장하기 전에 조작을 위해 스트림을 deserialize하는 데 사용됩니다.

또 다른 프로젝트는 Consumer이라고 부르며 데이터베이스에 저장된 데이터를 가져 와서 화면에 시각화합니다. 동일한 모델 클래스를 사용하여 저장된 데이터를 deserialize하여 시각화 응용 프로그램에 사용합니다.

ObjectModel을 Eclipse 프로젝트에 넣으려고 ProducerConsumer 프로젝트에서 소스를 공유하려고했습니다. 그러나 각 응용 프로그램에는 패키지 - 개인 액세스 수정자를 활용하여 ObjectModel의 필드를 가져오고 설정하는 동일한 패키지에있는 클래스가 있습니다.

여러 Eclipse 프로젝트에서 소스를 공유 할 수 있고 공유 소스와 패키지 개인 액세스를 유지할 수있는 방법이 있습니까?

업데이트 : : 이클립스 프로젝트에서 코드를 공유하는 데 문제가있어서 게시 전에이 코드를 사용하지 않았습니다. 마침내 그 부분을 작동시키고 다른 대답 here으로 썼습니다.

+0

'공유 소스와 패키지 - 개인 액세스를 계속 유지 하시겠습니까?' – Vikdor

+0

'Producer'는 여러 개의 서로 다른 스트림의 데이터를 캡슐화하는'ObjectModel' 인스턴스를 생성하는'ObjectModelFactory' 클래스를 가지고 있습니다. 'Consumer' 클래스에는 라이브 업데이트를 deserialize 된'ObjectModel'으로 병합하는 클래스 인'ObjectModelMerger'가 있습니다. 'ObjectModelFactory'와'ObjectModelMerger'를 제외하고는 프로그램의 어떤 부분에도 setter가 필요 없기 때문에 접근자를 거치기보다는이 클래스들 각각이'ObjectModel' 필드에 직접 접근하는 편이 훨씬 낫습니다. - 제한하고 싶습니다. 'ObjectModel' 필드의 설정에 액세스 할 수 있습니다. – ericsoco

답변

1

Producer 및 Consumer 프로젝트의 클래스가 ObjectModel과 동일한 패키지에서 선언되는 한 모든 것이 제대로 작동해야합니다.

그러나 디자인을 다시 생각하고 ObjectModel에 공용 접근 메서드 (getter 및 setter)를 제공 할 수 있습니다. 위의 @GreyBeardedGeek 대답에

+0

위의 내 코멘트를 참조하십시오 : 디자인. – ericsoco

1

봐 :

만큼 생산자와 소비자 프로젝트의 클래스로 objectModel를 같은 패키지에 선언되어있다, 그것은 모든 단지 작동합니다.

Java에서 C++ 친구를 찾고 있습니다. 일반적으로 은 잘못된 디자인의 예가 될 수 있습니다. 디자인이 괜찮 으면 "패키지 개인 액세스"를 사용하여 친구를 구현하는 Java 표준 방법입니다. 수업이 다른 프로젝트에 있다면 기술적으로 효과가있을 것입니다 ... 디자인이 괜찮다고 생각한다면 어쩌면 * Heper 클래스 사용을 고려하고 싶을 것입니다.

public class SomeClass { 
void foo(){... 
} 
} 

public class SomeClassHelper { 
private SomeClass someClass; 
public SomeClassHelper(SomeClass someClass){ 
    //you can do it better this with some DI Framework, 
    //for illustration purpose 
    this.someClass=someClass; 
} 

public SomeClassHelper(){ 
    //for illustration purpose only 
    this.someClass=new SomeClass(); 
} 

**public** void foo(){ 
    //this is punch line 
    someClass.foo(); 
    } 

}

당신은 SomeClass와 같은 패키지에 SomeClassHelper 배치해야하지만, SomeClassHelper 다른 소스 폴더 또는 프로젝트에있을 수 있습니다 예를 들면 다음과 같습니다.

+0

이전에 친구 패턴을 보지 못했습니다. 삽화를 보내 주셔서 감사합니다. 기능의 하위 집합을 노출하는 데 유용하지만,이 경우에는'ObjectModel'의 모든 필드에 대한 쓰기 액세스를 원하므로 ObjectModel 내에 직접 접근하는 것과 유사합니다. - 원하는 것보다 많은 코드 . – ericsoco

관련 문제