创建可重用的Java函数

时间:2013-09-17 12:31:53

标签: java string function tapestry

我在Java Tapestry中有一个打印3个文本块的页面,我们称之为BlockOfTextOne,BlockOfTextTwo,BlockOfTextThree。对于每个文本块,如果内容超过170个字符,我想截断内容并添加“阅读更多”链接。

我正在使用Java的方便BreakIterator类来返回文本块的第一部分,在最接近170个字符的句子边界处剪切,然后从该边界返回文本块的第二部分

我有这个用于BlockOfTextOne。我想建议让我的文本截断函数可以为每个BlockOfTextN重用,这样我就不需要重复代码了。我还要感谢其他代码改进的建议,到目前为止我所做的更多是实验的结果,而不是专业知识。

这是我到目前为止所拥有的:

在TML文件中,我检查字符串是否超过允许的长度。如果是,请运行truncate function并打印readmore按钮。否则,只需打印字符串:

<t:if test="isQuestionTooLong()">
  ${getBeginningOfBlockOfTextOne()}
  <button type="button" class="readmore">Read More</button>
  <div>${getTheRestOfBlockOfTextOne()}</div>
    <p:else>
     ${case.blockoftextwholestring} 
    </p:else>
</t:if>

在.java文件中,我得到了文本块的第一位:

 public String getBeginningOfBlockOfTextOne() {   
    int summaryLength = blockoftextwholestring.length();
    BreakIterator bi = BreakIterator.getSentenceInstance();
    bi.setText(blockoftextwholestring);
    int first_after = bi.following(MAX_LENGTH_TEXT_QUESTION);
    String firstBit = blockoftextwholestring.substring(0, first_after);
    return (firstBit);
}

然后我得到文本块的第二位,复制大部分代码,基本上只改变传递给substring的参数:

public String getTheRestOfBlockOfTextOne(){
    BreakIterator bi = BreakIterator.getSentenceInstance();
    bi.setText(blockoftextwholestring);
    int first_after = bi.following(MAX_LENGTH_TEXT_QUESTION);
    String secondBit = blockoftextwholestring.substring(first_after, summaryLength);
    return (secondBit);
}

我知道我可以将它们分解为可重复使用的组件,但不知道最好的方法。我还希望能够为BlockOfTextTwo和BlockOfTextThree重用这两个。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

为每个要显示的字符串都有一个@Property,并在@SetupRender方法中初始化它们。如果需要,@ SetupRender方法可以调用私有帮助器方法。

或者,只需要为要在页面上显示的每个字符串设置getter,然后将其委托给私有帮助器方法。

BTW:${getFoo()}最好写成${foo}

答案 1 :(得分:0)

这看起来像应该作为一个组件实现的东西。当你有冗余代码时,它应该是一个服务(在页面和组件之间共享)或一个组件(如果它是面向UI的)。

在Tapestry中,组件非常便宜和简单,您应该始终考虑创建新组件。就像你可以将一个大的复杂方法重构为几个小方法一样(即使新方法只在一个地方调用),你应该考虑将一个非常大的页面分成许多组件。