Java Rückgabe über Methodenargumente

HerzogDeXtEr

Cadet 4th Year
Registriert
Aug. 2007
Beiträge
86
Hi,

ich hab folgende Aufgabe:
ich soll aus einem Interface 2 Klassen ableiten:
Interface wie folgt:

Code:
public interface ICodec
{
	public String GetFileType();
	public void Encode(byte[] _Input, int[] _Output);
	public void Decode(int[] _Input, byte[] _Output);
}

Ableiten is schon klar mit extends und so, funktionen implementieren auch klar,

Nun soll ich aber in der Implementierten Methoden Encode zum Bleistift
einen byte-Array übergeben und diesen in ein int-Array umwandeln, auch kein Problem, mein Problem ist jetzt aber das ich in dieser "geerbten" Methode keinen Rückgabewert habe und es anscheinend nicht so schön wie in C/++ über Pointer funktioniert, und ich in der Ausgangsfunktion dann nach wie vor ein null statt den in das int-Array geschriebenen Werte habe.

noch die Code-Schnipzel dazu:
Code:
	public void Encode(byte[] _Input, int[] _Output)
	{
		_Output = new int[_Input.length];
		for(int i = 0; i < _Input.length; i++)
		{
			_Output[i] = (int)_Input[i] + 5; 
		}
	}
das wäre die encode-Methode


Code:
codec.Encode(byte_arr, result);
(codec ist von der Klasse her der Richtige Typ, der Aufruf funktioniert ja)
Hier also der Aufruf der ENcode-Methode, natürlich möchte ich danach etwas mit machen und bekomme ledigliche eine Nullpointerexception.

Bin dankbar für jede Hilfe
MfG

Edit: das result (int-Array) möchte ich danach mit den eingetragenen Werten nutzen
 
Zuletzt bearbeitet: (was vergessen)
Du könntest "Schummeln" und eine Wrapperklasse für den Output übergeben. C# hat sowas auf jeden Fall, ich denke Java hat sowas auch.
 
hat es ist aber damit würde ich ja die Methodenparameter ändern (böse ^^) mir würde auch ein nein reichen es geht nich dann kann ich meinen Prof wenigstens zusabbeln :)
 
Hmm wenn du die Methode ändern könntest, könntest du den "Rückgabewert" statisch speichern, heißt du hast irgendwo ´nen festen Mittelsmann, auf den zugegriffen wird. Dazu müsstest du aber den Code in der Methode ändern. Ansonsten hast du meines Wissens nach keine Möglichkeiten.
 
das hat mirn kumpel auch vorgeschlagen ^^, also hab ich auch schon drüber nachgedacht aber das ist ja noch viel unschöner als einfach nen rückgabewert einzubauen.
 
Also ich dachte bei der Wrappergeschichte, dass es vom Compiler her möglich ist das so umzuändern. Dass es also schon ein gewrapptes Int von Java aus gibt und der Compiler macht das zum ursprünglichen Int kompatibel. Hab´ das aber noch nie gebraucht, vielleicht gibt es sowas.
Ansonsten wie gesagt der Mittelsmann. Ist aber wirklich scheiße das so zu machen. Unnötig und tut man einfach nicht.
Aber weiß der Prof das nicht selber? Wieso das Gnaze?
 
Java kennt keine Referenzparameter. Wenn man die Methode nicht in eine Funktion umwandeln kann/darf die Output zurück gibt (was die beste Lösung wäre) gibt es also keine einfache Möglichkeit den Output-Parameter aus der Funktion herauszubekommen, außer natürlich ganze Klassen oder Interfaces reinzureichen .

Die Lösung des Problems besteht (wenn man das Interface partout nicht ändern will) darin, den Speicher für Output schon im Aufrufer zu allozieren.

Ich würde den Prof auf jeden Fall noch darauf hinweisen dass das Interface-Design verbesserungswürdig ist :).

Gruß,
Gunter
 
Zuletzt bearbeitet:
hmm gunters, danke genau so ^^
aus irgendeinen grund hatte ich das nicht ausprobiert, obwohl ichs im kopf hatte^^,
danke für den denkanstoß und danke für die hilfe von euch

:)
 
Code:
public class MyClass implements ICodec {

	public MyClass() {
		byte[] in = new byte[]{1, 2, 4, 8, 16, 32};
		int[] out = new int[in.length];

		Encode(in, out);

		for (int i : out) {
			System.out.println(i);
		}
	}

	public void Encode(byte[] _Input, int[] _Output) {
		if (_Input.length != _Output.length) {
			throw new IllegalArgumentException("input and output must have the same length!");
		}
		for (int i = 0; i < _Input.length; i++) {
			_Output[i] = _Input[i] + 5;
		}
	}
}
Implementiers halt so. Dann hast wenigstens noch ne kleine Absicherung, auf die der Benutzer reagieren kann, wenn er auf die Nase fällt. Ausserdem kann man dieser "unschönen" Methodik auch was Gutes zusprechen. Es ist halt einfach am schnellsten, wenn ich bereits allokierten Speicher habe, da einfach reinschreib, nix zurückgeben muss und gut ist. Wrapper sind einfach langsam. Und wozu gibts Api-Dokus? ;)
 
DIese Methodik empfinde ich nicht als unschön ich hab sie nur aus irgendeinem Grund nicht bewusst gemacht^^
ICh habe sie ja auch so eben umgesetzt nachdem gunters mir das geschrieben hat :)
Trotzdem danke für den hinweis mit der throws deklaration idf.
 
Zurück
Oben