Verwendet Ihr collections?



  • Hi

    ich finde die COllections so nervig, da man ja nicht den Objekt Typ angeben kann der im Vector beispielsweise Platz finden soll.

    Also muss ich nun dauernd rum casten, das ist unschön und nervig. Ausserdem ist es gefährlich. ANgenommen ich habe eine Klasse deren Konstruktor ein Vector mit Objekten vom Typ a übergeben bekommt. Ich kann nun nicht zwingendermaßen vorschreiben das nur Objeckte vom Typ a übergeben werden dürfen.

    EIn Programmierer der meine Klasse verwendet bekommt dann erst zur Laufzeit einen Fehler und nicht beim compilieren. Das finde ich ziemlich ungeschmeidig.

    in 1.5 soll das ja kommen aber ersten dauert das noch ein halbes Jahr und zweitens habe ich schon zig Klassen mit obiger Misere geschieben..



  • Yo, da ist C++ um Welten weiter. Aber ich würde das dann anders lösen, in dem ich den Container in einer eigenen Klasse verstecke.

    class Fahrzeuge{
        private Vector fzgs = new Vector();
        public void add(Fahrzeug fzg){
             fzgs.add(fzg);
        }
        // usw.
    }
    

    Das ist die einzige Möglichkeit Typsicherheit reinzubringen, wenn diese für einen höchste Prio darstellt.



  • Wenn du das als API zur Verfügung stellen möchtest, lohnt es sich eventuell auch eine Wrapper Klasse um die Collections zu basteln, die dir dann den richtigen Typ zurückgeben. da kannst du dann auch sicherstellen, dass nur Objekte des richtigen Typs aufgenommen werden.

    Ich mache das in diesem Fall tatsächlich so.

    Ansonsten stimmt es: Hier fehlen eindeutig Templates, um das ganze eleganter und mit weniger Aufwand zu relaisieren.

    /Dirk



  • blauton.com schrieb:

    Hi

    ich finde die COllections so nervig, da man ja nicht den Objekt Typ angeben kann der im Vector beispielsweise Platz finden soll.

    Du kannst aber ruhig die Collection Klasse erweitern und die add Methode etc. überschreiben.

    import java.util.*;
    
    class Fahrzeug {
    	public int speed;
    	public int zylinder;
    
    	public Fahrzeug(int speed, int zylinder) {
    		this.speed = speed;
    		this.zylinder = zylinder;
    	}
    }
    
    public class MyVectorClass extends Vector {
    
    	public MyVectorClass() {
    		super();
    	}
    
    	public boolean add(Object o) {
    		if(!(o instanceof Fahrzeug)) {
    			System.out.println("nur fuer Fahrzeuge !");
    			return true;   //general contract lt. Doku
    		}
    		return super.add(o);    //general contract lt. Doku
    	}
    
    	public static void main(String[] args) {
    		MyVectorClass mvc = new MyVectorClass();
    		Fahrzeug f1 = new Fahrzeug(200, 6);
    		String str = new String();
    		Fahrzeug f2 = new Fahrzeug(350, 8);
    
    		mvc.add(f1);
    		mvc.add(str);
    		mvc.add(f2);
    
    		System.out.println("Last check: " + mvc.size());
    	}
    }
    

    kati



  • Wenn du dann noch eine weitere add-Methode spendierst, kann das ganze auch zur Compilezeit aufgelöst werden.

    public class MyVectorClass extends Vector { 
    
        public MyVectorClass() { 
            super(); 
        } 
    
        public boolean add(Object o) { 
            if(!(o instanceof Fahrzeug)) { 
                System.out.println("nur fuer Fahrzeuge !"); 
                return true;   //general contract lt. Doku 
            } 
            return super.add(o);    //general contract lt. Doku 
        } 
        public boolean Fahrzeug o) { 
            return super.add(o);    //general contract lt. Doku 
        }
    

    Aber, ist wie schon mehrfach gesagt einiges an extra code.

    /Dirk


Log in to reply