>You can instead list the non-null type first and give a default appropriate >for the field type. I'd be surprised if the IDL couldn't also do this.
I'm not sure that works for avro where null is used for an optional field. 2014-11-26 23:28 GMT+01:00 Sean Busbey <[email protected]>: > I usually use Schemas directly rather than IDL, so apologies if some of > this doesn't map directly. > > In a Schema with an optional field, or really any union, the default value > has to be of the first mentioned type. For optional fields this usually > means making the first value the null type and the default value null. > > You can instead list the non-null type first and give a default appropriate > for the field type. I'd be surprised if the IDL couldn't also do this. > > On Wed, Nov 26, 2014 at 3:56 PM, Niels Basjes <[email protected]> wrote: > > > Yes, the builders would do that for mandatory (= non-null) fields. > > > > The schemas I'm using have a lot of this pattern > > > > record Thing { > > union { null, Foo } optionalFoo; > > > > union { null, Bar } optionalBar; > > > > } > > > > record Bar { > > union { null, Blabla } optionalBlabla; > > } > > > > etc. > > > > So creating a record with a simple Thing.newBuilder().build() would still > > yield null values for both optionalFoo and optionalBar. > > > > > > > > On Wed, Nov 26, 2014 at 8:58 PM, Sean Busbey <[email protected]> > wrote: > > > > > What does an example schema look like in this case? > > > > > > Shouldn't the extant builders give you this behavior if you've made the > > > default for the optional fields non-null? > > > > > > -- > > > Sean > > > On Nov 26, 2014 11:34 AM, "Niels Basjes" <[email protected]> wrote: > > > > > > > Oops, > > > > That should be > > > > public Foo getFoo() > > > > and > > > > public Foo getAlwaysFoo() > > > > ofcourse > > > > > > > > On Wed, Nov 26, 2014 at 6:28 PM, Niels Basjes <[email protected]> > wrote: > > > > > > > > > Hi, > > > > > > > > > > I have a Java project where I'm using Avro as the serialization > > > > technology. > > > > > I have a deep nested structure and many fields are optional. > > > > > > > > > > Because of the 'random' nature of my application I want to be able > to > > > > > simply 'set' a value in that tree easily. > > > > > > > > > > So I want to have a setter in my class that looks like this (Assume > > > > > myStruct is an instance of the 'root' class generated by Avro): > > > > > > > > > > public void setSomething(String value) { > > > > > myStruct > > > > > .getFoo() > > > > > .getBar() > > > > > .getOne() > > > > > .getOther() > > > > > .setSomething(value); > > > > > } > > > > > > > > > > The 'problem' I ran into is that any of the 4 get methods can > return > > a > > > > > null value so the code I have to write is really huge. > > > > > For every step in this method I have to build null checks and > create > > > the > > > > > underlying instance if it is null. > > > > > I already started writing helper methods to do this for parts of my > > > tree. > > > > > > > > > > To solve this in a way that makes this code readable I came up with > > the > > > > > following which I want to propose to you guys (before I start > working > > > on > > > > a > > > > > patch). > > > > > > > > > > My idea is to generate a new 'get' method in addition to the > existing > > > > > normal get method for the regular instance of the class. > > > > > > > > > > So in addition to the > > > > > > > > > > public void getFoo() { > > > > > return foo; > > > > > } > > > > > > > > > > I propose to generate something like this as well > > > > > > > > > > public void getAlwaysFoo() { > > > > > if (foo == null) { > > > > > setFoo(Foo.newBuilder().build()); > > > > > } > > > > > return foo; > > > > > } > > > > > > > > > > This way the automatically created instance immediately has all the > > > > > defaults I have defined. > > > > > > > > > > Assuming this naming my code will be readable because it will look > > like > > > > > this: > > > > > public void setSomething(String value) { > > > > > myStruct > > > > > .getAlwaysFoo() > > > > > .getAlwaysBar() > > > > > .getAlwaysOne() > > > > > .getAlwaysOther() > > > > > .setSomething(value); > > > > > } > > > > > > > > > > I can create this same effect in my own project code. > > > > > But having this automatically generated by the Avro engine would > make > > > > life > > > > > a lot easier. > > > > > > > > > > Is this an idea you guys would consider to have in the main (Java) > > > > > generated code base? > > > > > If so, is the 'getAlways' prefix sensible? > > > > > > > > > > -- > > > > > Best regards > > > > > > > > > > Niels Basjes > > > > > > > > > > > > > > > > > > > > > -- > > > > Best regards / Met vriendelijke groeten, > > > > > > > > Niels Basjes > > > > > > > > > > > > > > > -- > > Best regards / Met vriendelijke groeten, > > > > Niels Basjes > > > > > > -- > Sean >
