Java SE 基础 · 点1 封装
封装学习
学习计划:Java SE 基础 · 1 封装
一、总结
1. 实体类封装
- 编写
Book实体类,将bookId、bookName、bookPrice、bookNum、bookstatus封装到Book实体类。 - 编写
Reader实体类,将readerId、readerName、borrowedBooks封装到Reader实体类。 - 编写
Librarian实体类,将staffId、staffName、department封装到Librarian实体类。
2. 构造方法
- 构造方法分为有参构造与无参构造,无参和有参的方法名一致。
- 有参构造中,需要在括号内添加实体类声明的参数,例如
Book(Integer bookId),可选全量构造与部分参数构造。当实体类参数过多时,不推荐全量构建,构造主要业务中的参数即可。 - 无参构造用于构造实体类参数默认值,括号内不能有任何声明参数,通过该构造方法设置参数默认值,例如
this.bookName = "unknown"。
3. setter/getter 方法
- 编写 setter,方法为
void类型,无返回值,参数为实体类中对应参数,使用this来设置当前实体类对象中对应参数值,例如setBookId(Integer bookId) {},内容通常为this.bookId = bookId。 - 编写 getter,方法为实体类中参数对应的类型,直接用
return返回参数值,例如Integer getBookId() {},内容通常为return bookId。 - 注意:
boolean类型参数的 setter 方法,通常为isXXX,而非setXXX。
4. 借书逻辑
- 在
Main类中,先初始化一个Reader实体类对象c,创建Book实体类类型的集合,再通过add将图书添加到集合,通过c.setBorrowedBooks()方法,添加到Reader实体类对象封装中的List<Book> borrowedBooks。 - 在编写借书方法中,通过
getBookNum()获取剩余书并记录下来,减一后,再通过setBookNum()重新设置当前对象中封装的图书剩余数量,实现"借一本图书"的逻辑。 - 在实际过程中,应当创建图书馆实体类来封装图书,并且借书和还书还需要排除书不存在、书信息为空的情况,以及解决并发过程中数据库内数据变化预期结果和实际结果不一致的情况。
5. 全量构造方法说明
- 在
Reader实体类的全量构造方法中,this.borrowedBooks = new ArrayList<>(initialList)里的new ArrayList<>(initialList),是为了在新建Reader对象时,事先写好borrowedBooks内容,再通过全量构造自动拷贝到实体类中的borrowedBooks,实现新建Reader对象时borrowedBooks就拥有initialList内容。 - 但在编写过程中,是在
Main类中先新建Reader对象,再通过Reader实体类中的 setter 方法来设置borrowedBooks,因此并没有体现出该作用。
二、代码
1. Book.java —— Book 实体类
importjava.util.*;//Book实体类publicclassBook{privateIntegerbookId;privateStringbookName;privatedoublebookPrice;privateintbookNum;//剩余图书数privatebooleanbookstatus;//表示是否停卖,true表示 停卖privatestaticfinalRandomrandom=newRandom();//无参应对未知情况(未知不可为空)publicBook(){this.bookId=random.nextInt(1000);this.bookName="Book_Unknown_"+random.nextInt(1000);this.bookPrice=0;this.bookNum=0;this.bookstatus=true;}//有参应对新增全量图书(不可为空)publicBook(IntegerbookId,StringbookName,doublebookPrice,intbookNum,booleanbookstatus){//默认停卖this.bookId=bookId;this.bookName=bookName;this.bookPrice=bookPrice;this.bookNum=bookNum;this.bookstatus=bookstatus;}//有参应对新增全量图书(不可为空),并且默认停卖publicBook(IntegerbookId,StringbookName,doublebookPrice,intbookNum){this(bookId,bookName,bookPrice,bookNum,true);//调用全参构造,传入默认值 false}//有参构造(重载),设置主要参数publicBook(IntegerbookId,StringbookName){this.bookId=bookId;this.bookName=bookName;}//setterpublicvoidsetBookId(IntegerbookId){this.bookId=bookId;}publicvoidsetBookName(StringbookName){this.bookName=bookName;}publicvoidsetBookPrice(doublebookPrice){this.bookPrice=bookPrice;}publicvoidsetBookNum(intbookNum){this.bookNum=bookNum;}publicvoidsetBookstatus(booleanbookstatus){this.bookstatus=bookstatus;}//getterpublicIntegergetBookId(){returnbookId;}publicStringgetBookName(){returnbookName;}publicdoublegetBookPrice(){returnbookPrice;}publicintgetBookNum(){returnbookNum;}publicbooleanisBookstatus(){//(布尔类型 通常为"is"而不是"get")returnbookstatus;}@OverridepublicStringtoString(){return"Book{bookId='"+bookId+"',bookName='"+bookName+"',bookPrice='"+bookPrice+"',bookNum='"+bookNum+"',bookstatus='"+bookstatus+"'}";}}2. Reader.java —— Reader 实体类
importjava.util.*;//Reader实体类publicclassReader{privateIntegerreaderId;privateStringreaderName;privateList<Book>borrowedBooks;//无参应对未知情况(未知不可为空)publicReader(){this.readerName="Unknown";this.borrowedBooks=newArrayList<>();}//有参应对新增全量读者信息(不可为空)publicReader(IntegerreaderId,StringreaderName,List<Book>initialList){//初始化列表+复制"initialList"this.readerId=readerId;this.readerName=readerName;this.borrowedBooks=newArrayList<>(initialList);}//有参构造(重载),设置主要参数publicReader(IntegerreaderId,StringreaderName){this.readerId=readerId;this.readerName=readerName;this.borrowedBooks=newArrayList<>();}//setterpublicvoidsetReaderId(IntegerreaderId){this.readerId=readerId;}publicvoidsetReaderName(StringreaderName){this.readerName=readerName;}publicvoidsetBorrowedBooks(List<Book>borrowedBooks){this.borrowedBooks=borrowedBooks;}//getterpublicIntegergetReaderId(){returnreaderId;}publicStringgetReaderName(){returnreaderName;}publicList<Book>getBorrowedBooks(){returnborrowedBooks;}//借书publicbooleanborrowBooks(List<Book>BorrowBooks,intn){for(Bookbook:BorrowBooks){if(n==0)returntrue;if(book.getBookNum()==0){book.setBookstatus(false);returntrue;}if(book!=null){intcurrent=book.getBookNum();current--;book.setBookNum(current);}n--;}returntrue;}//还书publicbooleanbackBooks(List<Book>BorrowBooks){for(Bookbook:BorrowBooks){if(book!=null){intcurrent=book.getBookNum();current++;book.setBookNum(current);}}returntrue;}@OverridepublicStringtoString(){return"Reader{readerId='"+readerId+"',readerName='"+readerName+"',borrowedBooks='"+borrowedBooks+"'}";}}3. Librarian.java —— Librarian 实体类
//Librarian实体类publicclassLibrarian{privateIntegerstaffId;privateStringstaffName;privateStringdepartment;String[]departments={"Science","Fiction"};//无参应对未知情况(未知不可为空)publicLibrarian(){this.staffName="Unknown";}//有参应对新增全量读者信息(不可为空)publicLibrarian(IntegerstaffId,StringstaffName,Stringdepartment){this.staffId=staffId;this.staffName=staffName;this.department=department;}//有参构造(重载),设置主要参数publicLibrarian(IntegerstaffId,StringstaffName){this.staffId=staffId;this.staffName=staffName;}//setterpublicvoidsetstaffId(IntegerstaffId){this.staffId=staffId;}publicvoidsetstaffName(StringstaffName){this.staffName=staffName;}publicvoidsetdepartment(Stringdepartment){//在选择中,只能是departments中的元素try{if(department.equals(departments[0])||department.equals(departments[1])){this.department=department;}else{thrownewIllegalArgumentException("无效的部门名称: "+department);}}catch(IllegalArgumentExceptione){System.err.println("参数错误: "+e.getMessage());}}//getterpublicIntegergetstaffId(){returnstaffId;}publicStringgetstaffName(){returnstaffName;}publicStringgetdepartment(){returndepartment;}@OverridepublicStringtoString(){return"Librarian{staffId='"+staffId+"',staffName='"+staffName+"',department='"+department+"'}";}}4. Main.java —— 测试主类
importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){Booka=newBook();System.out.println("------无参构造Book,id随机,name随机,停卖------");System.out.println(a.toString());System.out.println();Bookb=newBook(29901001,"我肯定是第一本书",25.8,100,false);//false表示未停卖System.out.println("------有参构造Book(29901001,\"我肯定是第一本书\",25.8,100,false)------");System.out.println(b.toString());System.out.println();b.setBookstatus(true);//将b书停卖System.out.println("------b书停卖了吗?状态应为true------");System.out.println(b.toString());System.out.println();Readerc=newReader();//无参构造Reader,此时name为unknown,其余参数为空System.out.println("------无参构造Reader,此时name为unknown,其余参数为空------");System.out.println(c.toString());System.out.println();c.setReaderName("我原来有名字");//调用setter,为reader重命名,对比之前的nameSystem.out.println("------调用setter,为reader重命名,对比之前的name------");System.out.println(c.toString());System.out.println();List<Book>initialList=newArrayList<>();//一共图书initialList.add(newBook(1001001,"AAA",100.0,501));initialList.add(newBook(1001002,"BBB",200.0,601));initialList.add(newBook(1001003,"CCC",300.0,701));c.setBorrowedBooks(initialList);//存入图书馆System.out.println("------将initialList中包含的三本图书存入图书馆------");System.out.println(c.toString());System.out.println();c.borrowBooks(initialList,1);//借一本AAA图书System.out.println("------借一本AAA图书,num应为500------");System.out.println(c.toString());System.out.println();Librariand=newLibrarian(20050505,"Jack");//有参构造员工id和named.setdepartment("Science");//单独set员工所属部门System.out.println("------有参全量构建员工(20050505,\"Jack\"),查看department是否为\"Science\"------");System.out.println(d.toString());System.out.println();}}