伊莉討論區

標題: [求助]請教關於認證考題一題敍述 [打印本頁]

作者: ahway9988    時間: 2019-3-1 11:54 PM     標題: [求助]請教關於認證考題一題敍述

這是關於封裝的一個原廠考題
請教有人可以幫忙解釋當中的意思嗎

選擇三個正確的答案:
Which three statements are benefits of encapsulation??

A.Allows a class implementation to change without changing the clients
B.Protects confidential data from leaking out of the objects
C.Prevents code from causing exceptions
D.Enables the class implementation to protect its invariants
E.Permits classes to be combined into the same package
F.Enables multiple instances of the same class to be created safely

答案是A,B,D

個人比較有疑問的是 D 和 F

D是不是 保護它們的變數不被改變?
F 我問老師 ,但我還是聽不懂,難道不是我想的那樣,保護它們當它們在被創造時,如在建構的時候同時所傳的參數?

作者: kwj    時間: 2019-3-3 12:09 PM

本帖最後由 kwj 於 2019-3-3 12:09 PM 編輯
D是不是 保護它們的變數不被改變?
比較詳盡的講法是「保護變數」,而不是「保護變數不被改變」。封裝後可以把變數設置為只能透過特定 method 存取,因此可以在 method 上制定某些規則,讓呼叫者可以修改變數,但只限定在 method 允許的範圍內修改。
F 我問老師 ,但我還是聽不懂,難道不是我想的那樣,保護它們當它們在被創造時,如在建構的時候同時所傳的參數?
看不懂你的描述,可以先講講你想的是如何。
作者: ahway9988    時間: 2019-3-3 01:04 PM

我在上課的過程中依稀可以記得老師好像有講到一個建構子的用法,當它們在設值時,也習慣用setXXX設值,那時我不明白為什麼要這樣做,所以我就想是不是在建構時,也可以用來保護設值時設定了不當的內容,如 要求設定範圍為正數,或從字串中取得整數,結果傳進了小數等等

以下範例:
ClassA ...

public class ClassA {
    private int x;

    public ClassA(int conArgX){
        this.setX(conArgX);
    }


    public void setX(int argX){
        if(argX<0){
            argX=0;
        }
        this.x=argX;
    }

    public void showX(){
        System.out.println("X="+this.x);
    }


}


然後於main ...

public static void main(String[] args) {
        // TODO code application logic here
        ClassA classA=new ClassA(-1);
        classA.showX();
    }



但題目敍句的創建"多個"實例又讓我困惑了orz
F的敍句究竟是用在什麼情況下的呢?



作者: kwj    時間: 2019-3-3 01:29 PM

本帖最後由 kwj 於 2019-3-3 01:34 PM 編輯
ahway9988 發表於 2019-3-3 01:04 PM
我在上課的過程中依稀可以記得老師好像有講到一個建構子的用法,當它們在設值時,也習慣用setXXX設值,那時我 ...

這裡我比較建議分開來分別討論~全部混雜在一起會因為有太多概念,反而導致不太容易理解裡面的意圖。

首先,先思考一下為什麼需要 setXXX() 這種 method?這裡先不要談建構子,光只談你認為為什麼要用 setXXX() 來設定變數?舉例來說,對你而言下面這兩種寫法的差別是什麼?
  1. public class XXX {
  2.    public int variable1;
  3. }
複製代碼
  1. public class XXX {
  2.    private int variable1;

  3.    public void setVariable1 (int val) {
  4.       if (val >= 0) {
  5.          this.variable1 = val;
  6.       }
  7.    }
  8. }
複製代碼
當然你應該可以看出這兩段程式瑪代表的行為並不相同,而這就是一般我們想要使用 setXXX() 時最明顯的原因。

接著,在上面的前提之下,來思考為什麼我們會想要讓建構子呼叫 setXXX(),它跟直接在建構子裡 assign 變數的差別是什麼?



然後回到題目的話...其實我個人不是很看得懂 F 這個選項。首先選項的意思是指,當我透過 new XXX() 的方式產生 XXX 類別的 instance 時,要保證建立出來的每個 instance 都是安全的。不過最重要的問題在於,何謂「安全」?如果談到多個 instance 的話,直覺來講可能在談的是每個 instance 之間不受其他 instance 影響。而從這點來看,這個特性確實是跟封裝沒什麼關係。
作者: ahway9988    時間: 2019-3-3 01:48 PM

本帖最後由 ahway9988 於 2019-3-3 01:53 PM 編輯
kwj 發表於 2019-3-3 01:29 PM
這裡我比較建議分開來分別討論~全部混雜在一起會因為有太多概念,反而導致不太容易理解裡面的意圖。

首 ...

剛剛又去查證了一下,封裝是類的多種用途之一??(不敢確定 哈哈orz)
嗯 的確D敍述是符合的
然後大大您說的instance 之間不受其它instance影響,這看起來好像是類最基本的物件個自獨立的實例嗎??
就怕考試考這些 不知道算是拘泥還是刁鑽 的題目orz


更正:

java是一種面出現對象的程式語言,他的三個最重要的特性就是封裝,繼承和多態。

原文網址:https://kknews.cc/zh-tw/tech/vmr3362.html



作者: kwj    時間: 2019-3-3 02:29 PM

本帖最後由 kwj 於 2019-3-3 02:41 PM 編輯
ahway9988 發表於 2019-3-3 01:48 PM 剛剛又去查證了一下,封裝是類的多種用途之一??(不敢確定 哈哈orz)

嗯...雖然這描述本身是正確的,但我會比較建議不要用這個形式去思考就是了....。封裝的本意就是要隱藏某些東西,讓外界只需要知道它需要知道的事情就好。舉例來說,你可能用過 HashMap 這個類別,然後它提供了 put()、get() 等等的方法。對我們這些要使用 HashMap 的使用者來說,我只需要知道這個類別能夠以 Map 的形式存放我放進去的東西,並且它具有 Hash 的特性,這可以幫助我粗略了解使用它時大略會給系統帶來的負擔是什麼。但實際上我並不需要知道它到底用了什麼結構、程式碼怎麼寫的、甚至我不知道它到底怎麼運作的,我就可以使用它來達成我的其他目的,這就是「封裝」想要帶給我們的性質。使用者只需要知道最低限度的知識就好,可以把專注力放在其他更高階的問題上,而不是花非常多的時間去理解別人已經做過的事情。

然後大大您說的instance 之間不受其它instance影響,這看起來好像是類最基本的物件個自獨立的實例嗎??
就怕考試考這些 不知道算是拘泥還是刁鑽 的題目orz

這個很難說喔,實際上當你比較資深一點,開始開發 multi-thread 這種比較複雜的程式的時候,這種細節就會變成很重要的問題:多個 threads 呼叫同一個 instance、或者多個 threads 呼叫不同 instances,會對系統帶來什麼樣的影響?當然這個已經脫離了基礎認證的範疇,不過不要輕易地覺得深究這種細節沒有意義,因為清楚地對這些基礎細節有所認識~在你需要應付更高階的問題、更複雜的系統時,會直接地影響到你寫出來的程式碼的可靠性。
作者: ahway9988    時間: 2019-3-3 03:00 PM

懂了,初級原廠認證考就那麼嚴僅了,看來下一個認證考更難上加難,感謝大大的解惑orz




歡迎光臨 伊莉討論區 (http://a11.eyny.com/) Powered by Discuz!