boolean[] poate fi folosit ca tip de retur într-o metodă Java.În acest articol vom explora în detaliu regulile privind tipurile de retur în Java, cu focus special pe array-uri de primitive precum boolean[].
În Java, orice tip valid poate fi folosit ca tip de retur al unei metode. Aceasta include:
int, boolean, double, char, etc.boolean[], int[], double[]String[], Object[]String, ArrayList, clase customList, Comparable, interfețe customenum definitvoid: când metoda nu returnează nimicboolean[]Iată o metodă simplă care returnează un array de boolean:
public boolean[] getFlags() {
return new boolean[] { true, false, true };
}Sau, folosind o variabilă intermediară:
public boolean[] getFlags() {
boolean[] flags = { true, false, true };
return flags;
}
Ambele variante sunt perfect valide în Java.
În Java, boolean[] este un tip de referință, nu un tip primitiv. Când scriem boolean[], definim un array — iar toate array-urile în Java sunt obiecte.
Astfel:
public class FlagManager {
public boolean[] getDefaultFlags() {
return new boolean[] { true, false, true };
}
public static void main(String[] args) {
FlagManager manager = new FlagManager();
boolean[] flags = manager.getDefaultFlags();
System.out.println("Primul flag: " + flags[0]); // true
System.out.println("Lungime: " + flags.length); // 3
}
}Când returnezi un array, returnezi referința către acel array. Aceasta înseamnă că apelantul poate modifica conținutul original:
public class FlagManager {
private boolean[] internalFlags = { true, false, true };
// ATENȚIE: expune array-ul intern!
public boolean[] getFlags() {
return internalFlags;
}
}Problema apare astfel:
FlagManager manager = new FlagManager();
boolean[] flags = manager.getFlags();
// Modificăm array-ul primit
flags[0] = false;
// Acum și internalFlags[0] este false!
// Am modificat starea internă a obiectului fără să ne dăm seamaReturnează o copie a array-ului, nu originalul:
public boolean[] getFlags() {
return internalFlags.clone();
}Sau manual:
public boolean[] getFlags() {
boolean[] copy = new boolean[internalFlags.length];
System.arraycopy(internalFlags, 0, copy, 0, internalFlags.length);
return copy;
}În loc de array, folosește List<Boolean> imutabilă:
import java.util.Collections;
import java.util.List;
import java.util.Arrays;
public class FlagManager {
private final List<Boolean> flags = Arrays.asList(true, false, true);
public List<Boolean> getFlags() {
return Collections.unmodifiableList(flags);
}
}Pentru seturi mari de flag-uri, BitSet este mai eficient:
import java.util.BitSet;
public class FlagManager {
private BitSet flags = new BitSet();
public FlagManager() {
flags.set(0); // true
flags.clear(1); // false
flags.set(2); // true
}
public BitSet getFlags() {
return (BitSet) flags.clone();
}
}| Aspect | boolean[] | List<Boolean> | BitSet |
|---|---|---|---|
| Performanță memorie | Bună | Overhead de boxing | Excelentă |
| Imutabilitate | Nu | Da (cu wrapper) | Nu |
| Flexibilitate | Fixă | Dinamică | Dinamică |
| Acces indexat | flags[i] | flags.get(i) | flags.get(i) |
Da, boolean[] poate fi folosit ca tip de retur în Java. Este un tip de referință valid, iar metoda va returna o referință către array.
Puncte cheie de reținut:
clone() sau colecții imutabile pentru protecțieBitSet
Articol publicat pe blogul IUCOSOFT — cursuri și resurse pentru programatori Java.