基础语法
1. 字符的几种表示:(本质上 字符就是数字)
char capitalA = 'A'; assertEquals(65, capitalA); assertEquals('\u0041', capitalA); // 用\u+四位十六进制数字表示 assertEquals('\101', captialA); // 也可以用八进制来表示转义符,
2. 字符串对象表示固定长度的字符序列,而且是不可变的,即没有任何方法可以改变创建出来的对象
String a = "abc\r\n"; /** *java虚拟机创建了String对象“abc”,然后在创建一个新的String对象b,把“abc”传入 *其构造函数 */ String b = new String("abc");
因此,当我们需要动态创建字符串时,可以使用StringBuilder,新创建的对象表示空字符序列或者字符集合,你可以通过
append方法往集合中增加字符,然后调用toString方法转成字符串
学生信息系统需求
因此,在CourseSessionTest中增加如下测试
public void testRosterReport(){ session.enroll(new Student("A")); session.enroll(new Student("B")); String rosterReport = session.getRosterReport(); assertEquals(CourseSession.ROSTER_REPORT_HEADER + "A" + CourseSession.NEWLINE + "B" + CourseSession.NEWLINE + CourseSession.ROSTER_REPORT_FOOTER + "2" +CourseSession.NEWLINE, rosterReport); }
CourseSession中增加如下方法
String getRosterReport(){ StringBuilder buffer = new StringBuilder(); buffer.append(ROSTER_REPORT_HEADER); for(Student student:allStudents){ buffer.append(student.getName()); buffer.append(NEWLINE); } buffer.append(ROSTER_REPORT_FOOTER + allStudents.size() + NEWLINE); return buffer.toString();
重构
因此,CourseSession应该做的唯一事情是跟踪课程安排有关的所有信息,因此这里增加RosterReport类来生成报名表
1. RosterReportTest
public class RosterReportTest extends TestCase{ public void testRosterReport(){ CourseSession session = new CourseSession("ENGL","101",DateUtil.createDate(2003,1,6)); session.enroll(new Student("A")); session.enroll(new Student("B")); String rosterReport = new RosterReport(session).getReport(); System.out.println(rosterReport); assertEquals(RosterReport.ROSTER_REPORT_HEADER + "A" + RosterReport.NEWLINE + "B" + RosterReport.NEWLINE + RosterReport.ROSTER_REPORT_FOOTER + "2" + RosterReport.NEWLINE, rosterReport); } }
2. RosterReport
class RosterReport{ static final String NEWLINE = System.getProperty("line.separator"); static final String ROSTER_REPORT_HEADER = "Student" + NEWLINE + "----" + NEWLINE; static final String ROSTER_REPORT_FOOTER = NEWLINE + "# students = "; private CourseSession session; RosterReport(CourseSession session){ this.session = session; } public String getReport(){ StringBuilder buffer = new StringBuilder(); writeHeader(buffer); writeBody(buffer); writeFooter(buffer); return buffer.toString(); } private void writeHeader(StringBuilder buffer){ buffer.append(ROSTER_REPORT_HEADER); } private void writeBody(StringBuilder buffer){ for(Student student:session.getAllStudents()){ buffer.append(student.getName()); buffer.append(NEWLINE); } } private void writeFooter(StringBuilder buffer){ buffer.append(ROSTER_REPORT_FOOTER + session.getAllStudents().size() + NEWLINE); } }