Lombok: Is possible to use toString from a super class without "callSuper=true"?

Created on 14 Nov 2016  ·  3Comments  ·  Source: projectlombok/lombok

@ToString
class SuperClass {
   private @Getter @Setter int id;
   private @Getter @Setter String date;
}
@ToString(callSuper = true)
class MyClass extends SuperClass {
   private @Getter @Setter String field;
}

Calling toString from MyClass results in this output:

MyClass(super=SuperClass(id=1, date=00/00/0000), field=test)

Is possible to get something like this...

MyClass(id=1, date=00/00/0000, field=test)

... directly, without manipulate the output string?


cheers!

Most helpful comment

Now, it is sort of possible using something like

@ToString(callSuper = false)
class MyClass extends SuperClass {
   @ToString.Include(name="id")
    private int dummyId() {
        return id;
    }

   @ToString.Include(name="date")
    private int dummyDate() {
        return date;
    }

   private @Getter @Setter String field;
}

This is obviously only doable for a small number of fields (untested).

A better idea might be

@ToString(callSuper = false)
class MyClass extends SuperClass {
   @ToString.Include(name=" ")
    private int dummySuper() {
        return super.toString().replace(".*?\\(((?s:.*))\\)$", "$1");
    }

   private @Getter @Setter String field;
}
  • Using " " as the name may or mayn't work.
  • In "replace", I'm assuming that super.toString() is (or looks like) lombok-generated.
  • You get MyClass( id=1, date=00/00/0000, field=test) with one blank too much.

All 3 comments

Not really; we'd have to do resolution to pull that off, and we don't want to go there for the lombok basics, because resolution is very tricky (performance issues and far more bugs).

Now, it is sort of possible using something like

@ToString(callSuper = false)
class MyClass extends SuperClass {
   @ToString.Include(name="id")
    private int dummyId() {
        return id;
    }

   @ToString.Include(name="date")
    private int dummyDate() {
        return date;
    }

   private @Getter @Setter String field;
}

This is obviously only doable for a small number of fields (untested).

A better idea might be

@ToString(callSuper = false)
class MyClass extends SuperClass {
   @ToString.Include(name=" ")
    private int dummySuper() {
        return super.toString().replace(".*?\\(((?s:.*))\\)$", "$1");
    }

   private @Getter @Setter String field;
}
  • Using " " as the name may or mayn't work.
  • In "replace", I'm assuming that super.toString() is (or looks like) lombok-generated.
  • You get MyClass( id=1, date=00/00/0000, field=test) with one blank too much.
Was this page helpful?
0 / 5 - 0 ratings

Related issues

iskigow picture iskigow  ·  3Comments

Maaartinus picture Maaartinus  ·  3Comments

delverdev picture delverdev  ·  3Comments

lombokissues picture lombokissues  ·  3Comments

manuel-hegner picture manuel-hegner  ·  4Comments