5

Ich habe eine Modellklasse (MVC pattern), die ich in zwei Eclipse-Projekten verwende.Zugriff auf package-private Felder in Klassen, die in Eclipse-Projekten freigegeben sind

Ein Projekt, nennen wir es Producer, erfasst Daten aus einem Stream und speichert sie in einer Datenbank. Die betreffende Modellklasse, z. B. ObjectModel, wird verwendet, um den Stream für die Manipulation zu deserialisieren, bevor er serialisiert und in der Datenbank gespeichert wird.

Ein anderes Projekt, nennen wir es Consumer, zieht die in der Datenbank gespeicherten Daten ein und visualisiert sie auf dem Bildschirm. Es verwendet dieselbe Modellklasse, um die gespeicherten Daten für die Verwendung in der Visualisierungsanwendung zu deserialisieren.

Ich plante, ObjectModel in ein Eclipse-Projekt zu setzen, um seine Quelle über die Producer und Consumer Projekte zu teilen. Jede Anwendung verfügt jedoch über Klassen, die sich derzeit im selben Paket befinden und die den Modifikator "package-private access" zum Abrufen und Festlegen von Feldern in ObjectModel verwenden.

Gibt es eine Möglichkeit, die Quelle über mehrere Eclipse-Projekte hinweg zu teilen und dennoch den paketprivaten Zugriff mit der gemeinsam genutzten Quelle beizubehalten?

AKTUALISIEREN: Ich hatte Probleme, Code über Eclipse-Projekte freigegeben zu bekommen, weshalb ich dies nicht vor dem Posten versuchte. Endlich hat dieser Teil funktioniert, und schrieb es als eine andere Antwort here.

+0

können Sie näher erläutern, warum Sie den privaten Paketzugriff mit der gemeinsamen Quelle beibehalten möchten? – Vikdor

+0

'Producer' hat eine Klasse,' ObjectModelFactory', die 'ObjectModel'-Instanzen erstellt, die Daten aus mehreren unterschiedlichen Streams kapseln. 'Consumer' hat eine Klasse,' ObjectModelMerger', die Live-Updates in deserialisierte 'ObjectModels' zusammenfasst. Viel schöner für jede dieser Klassen, direkt auf 'ObjectModel'-Felder zuzugreifen, als durch Zugriffsmethoden zu gehen, insbesondere da in keinem Teil der Programme außer 'ObjectModelFactory' und' ObjectModelMerger' Setter benötigt werden - was ich gerne einschränken würde Zugriff auf die Einstellung von 'ObjectModel'-Feldern. – ericsoco

Antwort

1

Solange die Klassen in den Producer- und Consumer-Projekten im gleichen Paket wie das ObjectModel deklariert sind, sollte alles funktionieren.

Sie möchten jedoch möglicherweise Ihr Design überdenken und öffentliche Zugriffsmethoden (Getter und Setter) im ObjectModel bereitstellen.

+0

Bitte beachten Sie meinen Kommentar oben zu: Design. – ericsoco

1

Blick auf @GreyBeardedGeek Antwort oben:

Solange die Klassen in den Producer und Consumer-Projekte werden im gleichen Paket wie die ObjectModel erklärt, es sollte alles funktionieren.

Sie suchen den C++ Freund in Java. In der Regel kann es Symptom für falsches Design sein. Wenn Ihr Design in Ordnung ist, dann ist die Verwendung von "package-private access" Java Standard für die Implementierung von Freunden. Es wird technisch funktionieren, wenn Ihre Klassen in verschiedenen Projekten sind ... Wenn Sie denken, dass Ihr Entwurf in Ordnung ist, möchten Sie vielleicht die * Heper-Klasse in Betracht ziehen. Zum Beispiel:

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(); 
    } 

}

Sie sollten auf dem gleichen Paket wie Someclass platzieren SomeClassHelper, aber SomeClassHelper an verschiedenen Quellordner oder Projekt sein kann.

+0

Hatte das Friends-Muster noch nicht gesehen, danke für die Illustration. scheint vorteilhaft zu sein, um eine Teilmenge der Funktionalität freizulegen, aber in diesem Fall hätte ich gerne Schreibzugriff auf alle Felder von "ObjectModel", so dass dies analog zu Accessoren direkt innerhalb von "ObjectModel" wäre - mehr Code, als ich möchte . – ericsoco

Verwandte Themen