yuusuke-roughの日記

Java,SpringBoot,趣味等

プロJavaのテストケース・JavaGold取得を目指した日記

はじめに

JavaGold取得を目指して、まず月末は、昨年取得したJavaSilverの復習から入ります。

そして、MOSが取得できたので、全力で対策します。

各日記毎に分けていますが、一つずつ進めます。

 

JavaGoldはWindowsのPCでSTS(Eclipse)

プロになるJavaUbuntuのノートPCでIntellij IDEAを使用します。

 

Eclipseのショートカットで「実行」が効かない...

IntelliJ IDEAは全て使用できる...

 

※誤解していた内容も包み隠さず、記載いたしますので、日記枠にしました。

 

内容

 

アウタークラスとインナークラス

 

テーマ1:staticなインナークラスの呼び出しとstaticインナークラス外部の値へのアクセス

 

①staticなインナークラスの呼び出し

public class CH1_Q3 {

 

 private int value1 = 1;
    private static int value2 = 1;
    
    public static class judgeGetValue{
        
        private int getValue() {
         ...         

   return value2 * 1; 
        }

//----------------------------------------------------------------------

  public class Item{

        ...

  }
  }

 

上記のクラスを呼び出す時、

new CH1_Q3.judgeGetValue().getValue()でアクセスができる。

アウタークラスのCH1_Q3をインスタンス化して、static領域にあるjudgeGetValueクラスにアクセスするものと考えていたが、new CH1_Q3()...とすると動かない。

流れとしては、「new演算子でCH1_Q3をインスタンス化する。その際にCH1_Q3のコンストラクタを呼び出す」と理解していたが違うのだろうか...

 

今まで、new judgeGetValue().getValue()としていた事からも、結局同じことをしているのだろうか。

 

切り分け

staticじゃなくて、ただのインナークラスならどうか。

上記Itemクラスをインスタンス化してみる。この時、あえてItemクラスを直接インスタンス化してみる。

 

new CH1_Q3.Item()とすると...

アクセス可能な型 CH1_Q3 のエンクロージング・インスタンスがありません。型 CH1_Q3 のエンクロージング・インスタンスで割り振りを限定する必要があります (たとえば x.new A() で、x は CH1_Q3 のインスタンス)。

 

そもそも、

New演算子は初期化と記憶域の確保の2つに機能が分かれているとの事。

Javaでは初期化とオブジェクトの生成。プリミティブ型には必要ない。

 

以上の事から、

・new CH1_Q3()にてヒープ領域にアウタークラスCH1_Q3のインスタンスが生成される。

・インナークラスjudgeGetValueはスタティック領域に生成されている。

・ヒープ領域にインナークラスjudgeGetValueのインスタンスはないため、直接、static領域から呼び出さなくてはいけない。

・staticであろうとも、オブジェクトを利用する際には、プリミティブ型を除いて、初期化と記憶域の確保をしなければならない。

 

よって、new CH1_Q3.judgeGetValue().getValue()となる。

 

----------------------------

2月3日追記

変な解釈をしていた。

シンプルにstatic領域にあるクラスをインスタンスを生成しなければならない。

だから、

new com.example.demo.javaGold.CH1_Q3.judgeGetValue().getValue()

でも良い事になる。

-------------------------------

 

②staticなインナークラスの外部の値へのアクセス

上記コードのgetValue()内にて、同じstaticであるフィールドvalue2にはアクセスできる。

ただ、非staticフィールドvalue1のアクセスはできない。

 

テーマ2:非static領域からstatic領域へのアクセスとその逆

 

public static class Inner{

  

}

 

public class Inner_nonStatic{

  new Inner();

}

 

上記のように非static領域からstatic領域へのアクセスはできる。

しかし、その逆はできない。

CH1_Q2(アウタークラス)からインスタンス化して生成する。

 

ローカルクラス

ローカル変数とローカルクラスのライフサイクルの違いについて、検証したかったができなかったので、ひとまず、下記を意識する。

・ローカルクラス内で、ローカル変数を扱うときは実質的にfinalでなくてはならない。

・使用するローカル変数の宣言は、ローカルクラスの先にしなければならない。

※いつかちゃんと理解したい...

 

 

感想

上記に手こずり、プロJavaがあまり進めなかったうえにJavaGoldもテストケースを考える余裕がなかった...

入力した年、月、日のintの値をLocalDateに変換し、formattedで指定した書式で返すというメソッドを作り、テストケースを作成のみ。

 

まだ読んでいる段階なので記載していませんが、logging含めた独学であまり触れていなかった範囲が刺さった。

進め方にまだまだ無駄な時間があるので、引っ越し日までに安定させたい。