[ 
https://issues.apache.org/jira/browse/AVRO-1614?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Niels Basjes updated AVRO-1614:
-------------------------------
    Description: 
Sometimes the Avro structure becomes deeply nested.
If in such a scenario you want to be able to set a specific value deep in this 
tree you want to do this:

{code}
public void setSomething(String value) {
    myStruct
            .getFoo()
            .getBar()
            .getOne()
            .getOther()
            .setSomething(value);
}
{code}
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 
{code}
public Foo getFoo() {
    return foo;
}
{code}
I propose to generate something like this as well in the cases where this is a 
type of structure that you may want to traverse as shown in the example.
{code}
public Foo getAlwaysFoo() {
    if (foo == null) {
        setFoo(Foo.newBuilder().build());
    }
    return foo;
}
{code}
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:

{code}
public void setSomething(String value) {
    myStruct
            .getAlwaysFoo()
            .getAlwaysBar()
            .getAlwaysOne()
            .getAlwaysOther()
            .setSomething(value);
}
{code}


  was:
Sometimes the Avro structure becomes deeply nested.
If in such a scenario you want to be able to set a specific value deep in this 
tree you want to do this:

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 Foo getFoo() {
    return foo;
}

I propose to generate something like this as well in the cases where this is a 
type of structure that you may want to traverse as shown in the example.

public Foo 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);
}




> Always getting a value...
> -------------------------
>
>                 Key: AVRO-1614
>                 URL: https://issues.apache.org/jira/browse/AVRO-1614
>             Project: Avro
>          Issue Type: New Feature
>          Components: java
>            Reporter: Niels Basjes
>
> Sometimes the Avro structure becomes deeply nested.
> If in such a scenario you want to be able to set a specific value deep in 
> this tree you want to do this:
> {code}
> public void setSomething(String value) {
>     myStruct
>             .getFoo()
>             .getBar()
>             .getOne()
>             .getOther()
>             .setSomething(value);
> }
> {code}
> 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 
> {code}
> public Foo getFoo() {
>     return foo;
> }
> {code}
> I propose to generate something like this as well in the cases where this is 
> a type of structure that you may want to traverse as shown in the example.
> {code}
> public Foo getAlwaysFoo() {
>     if (foo == null) {
>         setFoo(Foo.newBuilder().build());
>     }
>     return foo;
> }
> {code}
> 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:
> {code}
> public void setSomething(String value) {
>     myStruct
>             .getAlwaysFoo()
>             .getAlwaysBar()
>             .getAlwaysOne()
>             .getAlwaysOther()
>             .setSomething(value);
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to