Skrócenie kodu toString()

Skrócenie kodu toString()
KA
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 2 lata
  • Postów:27
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

Kopiuj
@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;
    }
edytowany 2x, ostatnio: cerrato
Zobacz pozostałe 5 komentarzy
_13th_Dragon
Tu jak widać, musi drukować, nawet jak nie ma czego :)
cerrato
@_13th_Dragon: no ale null też jest wartością ;)
ZD
"Widzę ciemność, widzę ciemność"
_13th_Dragon
@cerrato, ja tu System.out.print(""); nie widzę żadnego nulla, czy totalnie oślepłem przy tym komputerze?
cerrato
Zbyt wnikliwe analizowanie żartów zabiera resztki godności ich autorom :(
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
1
Kopiuj
@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:

Kopiuj
@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();
}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Zobacz pozostałe 2 komentarze
ZD
Jawne użycie string buildera w tym zagadnieniu jest bardzo, bardzo elegancie w tym zagadnieniu. Lepiej wyraża intencje
Riddle
@ZrobieDobrze: Lepiej wyraża intencje łączenia stringów, niż "" + ""? Na pewno nie. StringBuilder to jest tylko i wyłacznie narzędzie do ogarnięcia overheadu performanceowego z konkatenacji stringów, które są dodawane niepotrzebnie do strnigpoola jak łączy się więcej niż dwa strnigi. Nie masz pojęcia o czym mówisz.
ZD
Dla mnie jest. Pokazuje "no to teraz do jednej zmiennej będziemy kumulowac więcej/zmienną ilosć wartości". Ale to mój odbiór
Riddle
Tak samo jak String na którym robisz +=.
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
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.


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
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:

Kopiuj
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")
        ;
    }
}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:8 dni
  • Postów:3277
4

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

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

wywołujesz ją tak:

Kopiuj
System.out.println(nullSafeBuilder(city, street, numberBuilding, apartmentNumber, zipCode));
edytowany 1x, ostatnio: piotrpo
ZD
Podoba mi się. Jakby na tym etapie nie kumał streamów, da się ta idea też napisać klasycznym kodem.
piotrpo
Dzięki, też mi się podoba ;)
RequiredNickname
  • Rejestracja:prawie 5 lat
  • Ostatnio:28 minut
  • Postów:620
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).

ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
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.


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.