Saját Writable
Lehetőségünk van saját Writable
osztály létrehozására, ehhez a WritableComparable
generikus interfészt kell
megvalósítanunk.
public interface WritableComparable<T> extends Writable, Comparable<T> { }
Ez az interfész nem tartalmaz metódusokat de kiterjeszt két másik interfészt. Ezek műveleteit kell megvalósítanunk:
public interface Writable {
void write(DataOutput var1) throws IOException;
void readFields(DataInput var1) throws IOException;
}
Ezen metódusok határozzák meg, hogy egy kell az adott adott Writable
osztály példányait írni és olvasni.
public interface Comparable<T> {
public int compareTo(T o);
}
Ez a metódus teszi majd lehetővé, hogy az osztály példányai összehasonlíthatóak legyenek.
A metódust úgy kell megírni, hogy egy egész számot adjon vissza, ami:
- -1: Ha
this
kisebb minto
- 0: Ha a két objektum egyenlő
- 1: Ha
this
nagyobb minto
Összetettebb típusok esetén érdemes a metódust az előre definiált compareTo
metódusokra (pl. Double::compareTo
)
visszavezetni.
Készítsünk egy olyan Writable
osztályt, mely egy órát és egy hőmérséklet tárol.
Az osztály teljes kódja elérhető itt.
public class TemperatureWritable implements WritableComparable<TemperatureWritable> {
public Text hour;
public DoubleWritable temperature;
public TemperatureWritable() {
this.hour = new Text("");
this.temperature = new DoubleWritable(Double.MIN_VALUE);
}
public TemperatureWritable(String hour, double temperature) {
this.hour = new Text(hour);
this.temperature = new DoubleWritable(temperature);
}
public void readFields(DataInput in) throws IOException {
this.hour.readFields(in);
this.temperature.readFields(in);
}
public void write(DataOutput out) throws IOException {
this.hour.write(out);
this.temperature.write(out);
}
public int compareTo(TemperatureWritable o) {
return this.temperature.compareTo(o.temperature);
}
}
A helyes működéshez kötelesek vagyunk megadni egy paraméter nélküli konstruktort, mely valamilyen kezdőértéket ad a mezőknek.
A implementált műveleteket egyszerűen az adattagok osztályaiban már definiált műveletekre vezetjük vissza.
A fájlba történő írás formátumát a toString()
metódus felüldefiniálásával tudjuk szémelyre szabni:
@Override
public String toString() {
return this.hour + ": " + this.temperature + "C";
}