Skrócenie kodu toString()

0

Mam kilka konstruktorów w adresie. I jeden kontruktor ma miasto i ulice ale nie ma reszty, drugi nie ma kodu pocztowego itd. W miejsce gdzie nic się nie wpisze wyskakuje null. Chciałem aby było wypisane to co jest bez nulla. Stworzyłem taki oto kod i działa. I pytanie czy da się to zrobić z mniejszą ilością kodu. Wiem że są adnotacje JSON które skracają kod do jednej linijki tyle że w IntelliJ IDEA nie umiem wstrzyknąć tego języka a piszę w javie. Jakieś pomysły ?

Zwykłe wyświetlenie toString()

Jarek Szcześniak 1987 Warszawa Wieżowa 20 null 00-021
Marek Kowal 1999 Sko null 25 null 00-231

Mój kod toString();

Jarek Szcześniak 1987 Warszawa Wieżowa 20 00-021
Marek Kowal 1999 Sko 25 00-231

@Override
    public String toString() {
        String stringWithoutValuesNull = null;

        if (city == null) {
            System.out.print("");
        } else {
            stringWithoutValuesNull = city;
        }
        if (street == null) {
            System.out.print("");
        } else {
            stringWithoutValuesNull += " " +  street;
        }
        if (numberBuilding == null) {
            System.out.print("");
        } else {
            stringWithoutValuesNull += " " + numberBuilding;
        }
        if (apartmentNumber == null) {
            System.out.print("");
        } else {
            stringWithoutValuesNull += " " + apartmentNumber;
        }
        if (zipCode == null) {
            System.out.print("");
        } else {
            stringWithoutValuesNull += " " + zipCode;
        }

        return stringWithoutValuesNull;
    }
1
@Override public String toString()
{
    StringBuilder sb=new StringBuilder();
    if(city!=null) sb.append(city).append(' ');
    if(street!=null) sb.append(street).append(' ');
    if(numberBuilding!=null) sb.append(numberBuilding).append(' ');
    if(apartmentNumber!=null) sb.append(apartmentNumber).append(' ');
    if(zipCode!=null) sb.append(zipCode).append(' ');
    return sb.toString().trim();
}

lub:

@Override public String toString()
{
    StringBuilder sb=new StringBuilder();
    for(String item:new String[] {city,street,numberBuilding,apartmentNumber,zipCode}) if(item!=null) sb.append(item).append(' ');
    return sb.toString().trim();
}
3
KotAli napisał(a):

Mam kilka konstruktorów w adresie. I jeden kontruktor ma miasto i ulice ale nie ma reszty, drugi nie ma kodu pocztowego itd.

I wszystkie są Stringami ? Czarno to widzę.
Duża ilość konstruktorów, z nieróżniącymi się listami argumentów, to źle się skończy.

To się ratuje np:
maksimum danych podawane jako specyficzny typ (np class KodPocztowy, Miasto )
enumy zamiast bool/ integerów (nie bardzo w tym temacie)

Wiem że są adnotacje JSON które

A co JSON ma do rzeczy ? Najpierw naucz się dobrze pisać kod (np bez drukowania) , na adnotacje przyjdzie czas. Widzę ze masz magiczne myślenie o nich.

tyle że w IntelliJ IDEA nie umiem wstrzyknąć tego języka

Bosch ... kto ci podrzucił takie myślenie / słownictwo ? Zmień "filmiki" jakie oglądasz.

0
ZrobieDobrze napisał(a):
KotAli napisał(a):

Mam kilka konstruktorów w adresie. I jeden kontruktor ma miasto i ulice ale nie ma reszty, drugi nie ma kodu pocztowego itd.

I wszystkie są Stringami ? Czarno to widzę.
Duża ilość konstruktorów, z nieróżniącymi się listami argumentów, to źle się skończy.

Całkowicie popieram.
Może:

class Person
{
    private String name,surname,city,street,numberBuilding,apartmentNumber,zipCode;
    public Person(String name,String surname)
    {
        this.name=name;
        this.surname=surname;
    }
    public String getCity() { return city; }
    ...
    public String getZipCode() { return zipCode; }
    public Person setCity(String city) { this.city=city; return this; }
    ...
    public Person setZipCode(String zipCode) { this.zipCode=zipCode; return this; }
}

class Foo
{
    public Bar()
    {
        final Person person
        =
            new Person("Jarek","Szcześniak")
            .setCity("Warszawa")
            .setZipCode("00-021")
        ;
    }
}
4

Piszesz sobie funkcję pomocniczą gdzieś tam, albo nawet w tej klasie:

    public static String nullSafeBuilder(String...elements){
        return Arrays.stream(elements)
                .filter(Objects::nonNull)
                .collect(Collectors.joining(" "));
    }

wywołujesz ją tak:

System.out.println(nullSafeBuilder(city, street, numberBuilding, apartmentNumber, zipCode));
1

Pytanie po co Ci tak przeciążone funkcje toString()?
To się przydaje do zapisywania stanu obiektów np. w logach a tam informacja, że dane pole jest nullem jest wręcz pożądana (na potrzeby późniejszego debugowania).

0
RequiredNickname napisał(a):

Pytanie po co Ci tak przeciążone funkcje toString()?
To się przydaje do zapisywania stanu obiektów np. w logach a tam informacja, że dane pole jest nullem jest wręcz pożądana (na potrzeby późniejszego debugowania).

Racjonalne patrzenie.
Rzeczywiście taka był pierwotna idea toString(0) - informacja debugujaca.
Lata troszkę przesunęły akcent, za dużo ludzi zaczęło używać jako formatowanie użyteczne dla endusera.

1 użytkowników online, w tym zalogowanych: 0, gości: 1