2014-09-18 2 views
0

Я действительно копаю способность groovy элегантно перемещаться по иерархиям объектов, используя точечную нотацию.Динамически создавать встроенные экземпляры во время навигации

Один вопрос, который есть у меня есть, есть ли способ создавать внедренные объекты элегантно, а также во время навигации. Например, учитывая следующие классы:

class Bar { 
     int a 
    } 
    class Foo { 
     Bar b 
    } 

Я хочу, чтобы быть в состоянии сделать это:

Foo f = new Foo() 
    f.b.a = 4 

В настоящее время, я должен сделать:

Foo f = new Foo() 
    f.b = new Bar() 
    f.b.a = 4 

Обратите внимание, что мне нужно фб быть нулевым, если оно не было установлено с помощью навигации или иным образом. Таким образом, слепое создание b = new Bar() внутри класса Foo не отвечает потребностям требования.

ответ

1

Вы можете использовать нулевой безопасный оператор ?. или переопределить геттер для b в Foo и если это нулевой установить новый экземпляр b в Foo и вернуть его.

Было бы:

class Foo { 
    Bar b 

    Bar getB() { 
    if(b == null) 
     [email protected] = new Bar() 
    b 
    } 
} 
+0

Не можете упростить 'это @ B = новый бар() 'to' b = new Bar() '? –

+0

Не уверен, когда геттер переопределен. – Opal

+0

«Не уверен, когда геттер переопределен». - В вашем примере кода в списке не будут отменены коэффициенты. –

0

Вы можете инициализировать всю иерархию в одной строке, например:.

Foo f = new Foo(b: new Bar(a: 4)) 
+0

Исходный вопрос включает в себя «Обратите внимание, что мне нужно, чтобы f.b был пустым, если он не был установлен с помощью навигации или иным образом». Неясно, что «в противном случае» может означать, но я думаю, что хочет, чтобы предмет был нулевым до тех пор, пока он не будет доступен. Я читал его, как будто просто хотел, чтобы он лениво инициализировался, но не уверен. –

+0

@JeffScottBrown получил его, спасибо за разъяснение –

+0

«спасибо за разъяснение» - не принимайте мои комментарии как пояснения. Это может быть противоположно разъяснению. Возможно, я еще глубже задал вопрос. Я просто выражал, как я читаю вопрос. Возможно, я ошибаюсь. –

Смежные вопросы