| /////////////////////////////////////////////////////////////// |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| /////////////////////////////////////////////////////////////// |
| |
| [[tut-composites-step7,Step 7 - Properties]] |
| = Step 7 - Properties = |
| |
| Previous step was <<tut-composites-step6>>. |
| |
| One of the goals of Zest™ is to give you domain modeling tools that allow you to more concisely use domain concepts in |
| code. One of the things we do rather often is model Properties of objects as getters and setters. But this is a very |
| weak model, and does not give you any access to metadata about the property, and also makes common tasks like UI binding |
| non-trivial. There is also a lot of repetition of code, which is unnecessary. Using JavaBeans conventions one typically |
| have to have code in five places for one property, whereas in Zest™ the same thing can be achieved with one line of code. |
| |
| But lets start out easy. To declare a property you have to make a method in a mixin type that returns a value of the |
| type Property, and which does not take any parameters. Here's a simple example: |
| |
| [source,java] |
| ---- |
| Property<String> name(); |
| ---- |
| |
| This declares a Property of type String with the name "name". The Property interface has methods "get" and "set" to |
| access and mutate the value, respectively. |
| |
| For now you will be responsible for implementing these methods, but later on these will be handled automatically, thus |
| reducing Properties to one-liners! |
| |
| In the Mixin implementation of the interface with the Property declaration you should have an injection of the Property, |
| which is created for you by Zest™. The injection can be done in a field like this: |
| |
| [source,java] |
| ---- |
| @State Property<String> name; |
| ---- |
| |
| The State dependency injection annotation means that Zest™ will inject the Property for you. The field has the name |
| "name", which matches the name in the interface, and therefore that Property is injected. You can then implement the |
| method trivially by just returning the "name" field. |
| |
| Properties can have Constraints just like method parameters. Simply set them on the Property method instead, and they |
| will be applied just as before when you call "set". |
| |
| Steps for this tutorial: |
| |
| - Remove JavaBeans properties from HelloWorldState. |
| - Remove HelloWorld and add the HelloWorldState and HelloWorldBehavior to the HelloWorldComposite interface. |
| - Remove the HelloWorldBehaviourSideEffect. |
| - Update the behaviour mixin to use the state interface accordingly. |
| - Add Property methods with the correct type and the @NotEmpty annotation. |
| - Update the state mixin to inject and return the properties as described above. |
| |
| == Solution == |
| |
| If you have successfully completed the task, you should end up with the following artifacts; |
| |
| Only +HelloWorldBehavior.java+ remains unchanged. |
| |
| Theses ones are deleted: |
| |
| - +HelloWorld.java+ |
| - +HelloWorldConcern.java+ |
| |
| *HelloWorldBehaviourMixin.java* |
| [snippet,java] |
| ---- |
| source=tutorials/composites/src/main/java/org/qi4j/tutorials/composites/tutorial8/HelloWorldBehaviourMixin.java |
| tag=solution |
| ---- |
| |
| *HelloWorldComposite.java* |
| [snippet,java] |
| ---- |
| source=tutorials/composites/src/main/java/org/qi4j/tutorials/composites/tutorial8/HelloWorldComposite.java |
| tag=solution |
| ---- |
| |
| *HelloWorldState.java* |
| [snippet,java] |
| ---- |
| source=tutorials/composites/src/main/java/org/qi4j/tutorials/composites/tutorial8/HelloWorldState.java |
| tag=solution |
| ---- |
| |
| *HelloWorldStateMixin.java* |
| [snippet,java] |
| ---- |
| source=tutorials/composites/src/main/java/org/qi4j/tutorials/composites/tutorial8/HelloWorldStateMixin.java |
| tag=solution |
| ---- |
| |
| Next step is <<tut-composites-step8>> |