Java: retourneert twee ints van een methodeaanroep

Ik doe dit veel in mijn code die werkt met veel 2-dimensionale coördinaten:

int[] getSize() {
    int[] res = {gridRows, gridColumns};
    return res;
}

Ik weet dat ik een kleine klasse kan definiëren en veiligheid van het type kan krijgen, maar dat heb ik niet omdat het me ergert om zo'n triviale klasse te hebben in zijn eigen kleine, triviale .java-bestand dat ik in mijn code moet opnemen.

Denk je dat dit lelijk, slecht of slecht is? Of doe je het ook?

3

6 antwoord

Als er een concept in uw project is dat u wilt ingekapseld, bijvoorbeeld van die twee ints zijn coördinaten, is er niets mis met het hebben van een klasse voor hen. Naar mijn mening is dat een stuk schoner dan iedereen dwingen om een ​​array te maken, enz.

Bijvoorbeeld, is iemand anders aan het ontwikkelen in hetzelfde project en roept het je methode aan, denk je dat het voor hen duidelijker is om een ​​int-array te krijgen met twee posities, of een object met de naam Coördinaten?

Verder zou je misschien dingen willen implementeren zoals het vergelijken van coördinaten, die op een correcte OO-manier kunnen worden ingekapseld als je een Klasse gebruikt. (Vergeet alstublieft niet het objectcontract te respecteren als je iets als gelijken hebt geherdefinieerd).

12
toegevoegd

In dit geval zou u Point kunnen gebruiken.

Over het algemeen zijn de esthetiek afgezien van, vaak zijn er genoeg triviale helper methoden gerelateerd aan zoiets, dat het logisch is om een ​​klasse te maken om deze te houden, in plaats van die logica overal verspreid te hebben. Soms is zelfs reden genoeg om een ​​goede toString() te gebruiken voor foutopsporing en logboekregistratie.

Waar erg hoge prestaties een probleem zijn, maak triviale hulpmethoden met veel verkeer definitief, zodat ze kunnen worden onderstreept.

Waar de enige dingen die de potentiële leden gemeen hebben, is dat ze worden geretourneerd door een functie, zeker een klas maken als je een toekomst ziet waarin ze meer gemeen hebben.

Overweeg in sommige gevallen ongeldig te verklaren en door te geven in een object met een groter bereik van een context waarop de methode de retourwaarden kan instellen. Dit moet met de grootste voorzichtigheid worden gebruikt - het kan gemakkelijk koppelkruip veroorzaken.

3
toegevoegd

je kunt het definiëren als een geneste statische klasse

om niet te vermelden dat de klasse veel meer zou toelaten (definieer bijvoorbeeld de bewerkingen op de 2D-coördinaten op 1 plek, stop ze in een set (gelijken werkt niet op arrays))

2
toegevoegd

U kunt een innerlijke klasse maken om de retourwaarden van de methode vast te houden. Dit heeft het voordeel dat u geen nieuw .java-bestand nodig hebt:

public class Parent{
  public Size getSize() {
    return new Size(gridRows, gridColumns);
  }

  public static class Size{
    //...
  }
}

Parent parent = new Parent();
Parent.Size size = parent.getSize();

Het definiëren van de klasse als "statisch" betekent in feite dat deze kan worden behandeld als een normale klasse (behalve dat u Bovenliggende grootte moet gebruiken in plaats van Grootte ). Als de klasse niet "statisch" is, kunt u geen nieuw exemplaar ervan maken zonder een instantie van de outter-klasse te hebben.

1
toegevoegd

Helaas is dit in Java de beste manier om meerdere waarden te retourneren. Ik gebruik meestal beide arrays of lijsten. Ik denk niet noodzakelijkerwijs dat het "slechte vorm" is, per se, om er een klasse voor te maken, maar het is niet nodig.

0
toegevoegd

Aangezien Java niet meerdere waarden uit methoden kan retourneren, gaat het bij u om de enige keuze voor het retourneren van meerdere waarden van hetzelfde type . Als de waarden van verschillende typen zijn, moet u een kleine klasse (een waardevoorwerp van sorteringen) schrijven voor het inkapselen van de retourwaarden.

Nog een andere, zelfs lelijkste optie, zou zijn om arrays als parameters door te geven en daar de retourwaarden achter te laten - een hack voor het simuleren van pass-by-referentie in Java. Zeer ontmoedigd.

0
toegevoegd