javadesign-patternsarchitecturejelly

java - how to extend app that violates open-closed principle


I'm trying to extend the functionality of a web application written in Jelly & Java.

Scenario: The app has 2 default, hardcoded labels: label1 & label2

Under index.jelly we have

<f:entry title="${%Label1}"
    field="label1">
    <f:textbox name="label1"
               value="${it.label1}"
               default=""/>
</f:entry>


<f:entry title="${%label2}"
    field="label2">
    <f:textbox name="label2"
               value="${it.label2}"
               default=""/>
</f:entry>

As you can see, the labels themselves and the values are hardcoded.

In the Java class, each label has its own assigned variable:

private Integer label1;
private Integer label2;

    public Integer getlabel1() {
        return label1;
    }

    @DataBoundSetter
    public void setlabel1(Integer label1) {
        this.label1= label1;
    }

    public Integer getlabel2() {
        return label2;
    }

    @DataBoundSetter
    public void setlabel2(Integer label2) {
        this.label2= label2;
    }

Keep in mind that the values are persisted through reflection (label1 field from index.jelly is matched with the databoundsetter in the .java file).

Supposing I want to add an indefinite number of labels, how can I persist them since I can't create a setter for each of them since I won't know how many I have?


Solution

  • An immutable Object with state and behavior:

       class Label {
    
            private final Integer label;
    
            Label(Integer label) {
                this.label = label;
            }
    
            public Label differentLabel(Integer label){
                return new Label(label);
            }
        }
    

    Then you can create multiple labels