casten von Interface zu Klasse unterbinden

Status
Nicht offen für weitere Antworten.
S

stev.glasow

Gast
Hi,
folgender Code:
Code:
public interface Point {
    public float getX();
    public float getY();
}

///////////////////////

public class PointImpl implements Point{
    
    
    private float x,y;
    
    public float getX(){
        return x;
    }
    public float getY(){
        return y;
    }
    
    public void setX(float val){
        x = val;
    }
    public void setY(float val){
        x = val;
    }
}

///////////////////////

public class Test{
	public static void main(String[] args){
		Point p =  ppp();
	    PointImpl pl = (PointImpl)p;
	    pl.setX(5);
	    System.out.println(p.getX());
	
	}
	
	static Point ppp(){
	    return new PointImpl();
	}
}
Ausgabe ist 5.

Wie kann ich es unterbinden, dass man Point p zu PointImpl casten kann, sprich das man nicht mehr die setX() aufrufen kann. Ich wollte mit dem Interface eigentlich erzwingen das man damit die Koordinaten nur lesen kann.
Wer KANN helfen?

PS: zum Thema kann-Wiederholung:
[schild=2 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1] es ist 2:53 Uhr[/schild]

nacht.
 
B

bygones

Gast
geht nicht (sag ich einfach mal)...

sobald einem böswilligen Programmiere die Impl Klasse bekannt ist kann er casten was er will...

du kannst nur so viel machen, dass du nur die Interface Definition bekannt gibts - möglichkeit wäre die Impl als private Klasse zu definieren... könnte gehen (oder ?)

mann ist das spät ;)
 
B

bygones

Gast
also, es geht so....

ein bsp:
Code:
public class PointTest {
  public static void main(String[] args) {
      Point p = PointFactory.getPoint();
  }
}

public interface Point() {
  // ....
}

public class PointFactory() {
  public static Point getPoint() {
     return new PointImpl();
  }


  private static class PointImpl implements Point {
    // ...
  }
}
[/code]
 

Bleiglanz

Gesperrter Benutzer
ginge doch auch mit einer anonymen inneren Klasse, die man in der Factory-Methode
Code:
PointFactory.getPoint();
zurückliefert?
 
B

bygones

Gast
klar - es gibt immer mehrere Möglichkeiten ein problem zu lösen ;)
 
S

stev.glasow

Gast
Soweit war mir das auch klar :) nur sollten Point und PointImpl public sein. Die PointImpl soll auch von anderern Klassen benutzt werde ohne diese jedes mal neu zuschreiben. Ich werds wohl so lösen:

Code:
public class PointImpl implements Point{
    
    private final Point p = new Point(){
        public float getX(){
            return x;
        }
        public float getY(){
            return y;
        }
    };
    private float x,y;
    
    public float getX(){
        return x;
    }
    public float getY(){
        return y;
    }
    
    public void setX(float val){
        x = val;
    }
    public void setY(float val){
        x = val;
    }
    
    public Point readOnly(){
        return p;
    }
    
    
}

Wenn noch jemand ne bessere Lösung weiß, immer raus damit.
 
B

bygones

Gast
sobald die Impl public ist kann jeder wie er Lust hat das ganze wieder zurückcasten - daher wäre das dann unnütz

möglichkeit wäre das Read-Only Pattern: http://www.java-forum.org/de/viewtopic.php?t=6090#28851

ansonsten stellt sich die Frage warum dann das Interface bzw. warum das Interface nicht auch die set Methoden definiert !
 
S

stev.glasow

Gast
Ne, das Read-Only Pattern hilft auch nicht, die Einschränkung, dass nur Klassen aus dem gleichen Package "Schreibrechte" haben gefällt mir nicht.
Ich glaub ich muss das nochmal umdenken, aber nicht mehr heute. *KnallerbsenRauskram* :D Notfalls bleibe ich bei der vorher genannten Lösung.
 
S

stev.glasow

Gast
Ich habe es jetzt mir eine inneren öffentlichen Klasse 'LowAccess' gelöst:
Code:
public class Point2D extends java.awt.geom.Point2D.Float{
    
    
    private final LinkedList<PositionListener> listeners = new LinkedList<PositionListener>();
    
    public Point2D(){
        super();
    }
    public Point2D(float x, float y){
        super(x, y);
    }
    
    public void setLocation(double x, double y){
        this.setLocation((float)x, (float)y);
    }
    
    public void setLocation(final float x, final float y){
        super.setLocation(x, y);
        final Iterator<PositionListener> i = listeners.iterator();
        while(i.hasNext()){
            i.next().positionHasChanged(x, y);
        }
    }
    
    public void addListener(PositionListener listener){
        listeners.add(listener);
    }
    public void removeListener(PositionListener listener){
        listeners.remove(listener);
    }
    
    public class LowAccess{
        public float getX(){ return x;}
        public float getY(){ return y;}
    }
    
}
Ist zwar nicht mehr der gleiche Code wie oben, aber das Problem ist (war) das gleiche. Das Iterface wird somit auch nicht mehr benötigt. Gibt's Meinungen?
 
S

stev.glasow

Gast
[edit]
achso hab "wo" gelesen, wieso denn nicht? Wenn ich sie private machen bringt mir das ja irgendwie nix. Oder was meinst du?
 
S

stev.glasow

Gast
Hier mal Beispiel in der Nutzung vielleicht wird dann auch mein Problem etwas klarer:

Code:
public class MoveableObject{
    private final Point2D myPosition = new Point2D();
    
    ...
    
    /* hier kann sich jemand meine Position holen
     * aber er soll diese nicht ändern dürfen
     */
    public Point2D.LowAccess getMyPosition(){  
    	return myPosition.new LowAccess();
    }
    
    ...
   
}
 
R

Roar

Gast
*grübel* willst du jetzt deine interfaceimplementierung vorm user verstecken oder willst du deine interfacei mplemention read-only machen?
 
S

stev.glasow

Gast
ready-only machen.
Man könnte auch die von 31. 12. 2004, 14:24 aber gefallen tut mir das alles irgendwie nicht. Deswegen wollte ich euch ja mal fragen
 
S

stev.glasow

Gast
Hat sich erledigt, ich mach'S jetzt ganz anderes :roll:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Object auf Interface casten? Geht das? Java Basics - Anfänger-Themen 21
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
B Datentypen Welcher Typ wird beim Casten übernommen? Java Basics - Anfänger-Themen 12
G Probleme beim casten von double zu int Java Basics - Anfänger-Themen 3
BuTTerBroTHDx Char Wert in int casten ? Java Basics - Anfänger-Themen 4
A Vererbung Mit Casten direkt auf Sub-Klasse Zugreiffen Java Basics - Anfänger-Themen 6
N Variablen zurück casten Java Basics - Anfänger-Themen 3
F Casten bei Implements Java Basics - Anfänger-Themen 2
S Klassen casten, IS-A Beziehung Java Basics - Anfänger-Themen 5
J Generics casten Java Basics - Anfänger-Themen 14
U Klassen Dynamisches Casten? Java Basics - Anfänger-Themen 39
T Probleme beim casten Java Basics - Anfänger-Themen 9
M Casten Java Basics - Anfänger-Themen 2
K Collections Vector zu String casten Java Basics - Anfänger-Themen 4
S Polymorphes Objekt in eigentliche Klasse casten Java Basics - Anfänger-Themen 6
masii Methoden Parameter casten? Java Basics - Anfänger-Themen 2
D Datentypen Abstrakter Datentyp lässt sich nicht casten Java Basics - Anfänger-Themen 7
U ArrayList casten Java Basics - Anfänger-Themen 37
F g.drawLine in g 2D casten Java Basics - Anfänger-Themen 5
A Klassen ArrayList richtig / sicher Casten? Java Basics - Anfänger-Themen 3
J Frage zu generischer Klasse und Casten Java Basics - Anfänger-Themen 14
M Frage zum Casten von Objekten Java Basics - Anfänger-Themen 5
M sicheres/unsicheres Casten bei Objekten Java Basics - Anfänger-Themen 13
D Object auf JTextpane / jTextArea casten? Java Basics - Anfänger-Themen 3
B Casten oder vielleicht was anderes? Java Basics - Anfänger-Themen 9
T Boolean in ein Objektdatentyp casten möglich? Java Basics - Anfänger-Themen 5
J Casten (Typumwandlung) Java Basics - Anfänger-Themen 12
P Casten Hash Map Java Basics - Anfänger-Themen 4
W Auf 'this' casten Java Basics - Anfänger-Themen 3
M Dynamisches Casten mal wieder Java Basics - Anfänger-Themen 4
M casten Java Basics - Anfänger-Themen 11
D Casten eines Objekts: Funktion der Oberklasse aufrufen Java Basics - Anfänger-Themen 4
G Datentypen char to int casten - falsches Ergebnis! Java Basics - Anfänger-Themen 6
S casten array in int von float Java Basics - Anfänger-Themen 5
A Dynamisches casten Java Basics - Anfänger-Themen 19
C Probleme beim casten und Objekt zugriff Java Basics - Anfänger-Themen 12
P Klasse nach Element casten Java Basics - Anfänger-Themen 4
G Double casten Java Basics - Anfänger-Themen 8
O Object nach Double casten Java Basics - Anfänger-Themen 11
L Object[] in String[] casten Java Basics - Anfänger-Themen 7
V Gelesene FTP Datei richtig casten Java Basics - Anfänger-Themen 9
T Properties casten Java Basics - Anfänger-Themen 4
G Arrays casten? Java Basics - Anfänger-Themen 12
G string "null" in null casten Java Basics - Anfänger-Themen 3
M casten und Generics Java Basics - Anfänger-Themen 9
S Objekt Casten Java Basics - Anfänger-Themen 4
G String nach int casten Java Basics - Anfänger-Themen 5
G Vektor auslesen und als int Variable casten Java Basics - Anfänger-Themen 4
G String in Date casten. Java Basics - Anfänger-Themen 7
G String in Date casten Java Basics - Anfänger-Themen 4
G String in Long casten Java Basics - Anfänger-Themen 2
G Object[] [] nach vector casten. Java Basics - Anfänger-Themen 3
G printStackTrace(); in String casten Java Basics - Anfänger-Themen 3
G String in int casten Java Basics - Anfänger-Themen 2
G Integer[] nach int[] casten - wie? Java Basics - Anfänger-Themen 2
D Arrays casten Java Basics - Anfänger-Themen 12
G Casten ? Java Basics - Anfänger-Themen 3
HaukeG Casten to String und Vergleichen Java Basics - Anfänger-Themen 2
G ich komm nicht weiter -> String in int casten Java Basics - Anfänger-Themen 4
T Casten von Choice auf Vector oder Object[] Java Basics - Anfänger-Themen 14
B Vector nach float[] casten Java Basics - Anfänger-Themen 6
G String zu byte[] "casten"? Java Basics - Anfänger-Themen 3
M Hin und Her Casten Object->int und int->Object Java Basics - Anfänger-Themen 3
T Typsicheres casten eines Objects Java Basics - Anfänger-Themen 5
D Object[] in Liste casten? Java Basics - Anfänger-Themen 8
T Chaosprogrammierer hat einen fehler beim casten? Java Basics - Anfänger-Themen 5
J Attribut casten Java Basics - Anfänger-Themen 3
A Array mit generischen Typen casten? Java Basics - Anfänger-Themen 6
C Automatisches Casten => inkompatibel Java Basics - Anfänger-Themen 7
G Byte-Code einlesen und zu Hex casten Java Basics - Anfänger-Themen 2
T Object[] zu String[] casten? Java Basics - Anfänger-Themen 3
R Double nach Integer casten Java Basics - Anfänger-Themen 8
L Adresse in String[] casten Java Basics - Anfänger-Themen 6
U ArrayLists und Casten Java Basics - Anfänger-Themen 2
O TreeMap nach Object[] casten? Java Basics - Anfänger-Themen 3
M Casten bei Objekten? Java Basics - Anfänger-Themen 4
M long nach String casten Java Basics - Anfänger-Themen 2
U String nach Integer Casten. Java Basics - Anfänger-Themen 4
G Sting nach int casten Java Basics - Anfänger-Themen 13
A Object casten? Java Basics - Anfänger-Themen 3
R Casten Java Basics - Anfänger-Themen 3
F Casten: Object nach Array Java Basics - Anfänger-Themen 10
M Casten Java Basics - Anfänger-Themen 2
H komme mit casten nicht klar Java Basics - Anfänger-Themen 3
I No Jakarta Enterprise Beans found with interface ignorieren? Java Basics - Anfänger-Themen 2
I No EJB found with interface of type Java Basics - Anfänger-Themen 12
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
Say Abstrakt oder Interface Java Basics - Anfänger-Themen 3
Say public/default Interface Java Basics - Anfänger-Themen 9
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
I Browser integriert in Desktop Applikation - Webcam interface not found Java Basics - Anfänger-Themen 26
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
D Interface Verständisfrage Java Basics - Anfänger-Themen 8
U Interface | constructor injection Java Basics - Anfänger-Themen 5
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
T Interface Map und Map.Entry Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben