Strings and Packages

基础语法

 

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);
  }

}
 

 

 

你可能感兴趣的:(虚拟机)