Jdkでの面白い機能(更新中)


目次

  • Record
  • Microbenchmark Suite
  • Text blocks
  • Helpful NullpointerException
  • JFR Event Streaming
  • Switch
  • Record

  • Kotlinのデータ類とは差が少ないような気がします.データの表現に使用します.
  • 機能
  • は、すべてのフィールドを含むジェネレータを有する.
  • すべてのフィールドはprivate finalであり、
  • に固定されている.
  • すべてのフィールドにgetterを作成
  • getName()の形式ではなく、フィールド名のみを取得します.
  • からString,equals,hashCode生成
  • 注記
  • 他のクラスから内部クラスに作成可能->jdk 16は
  • に使用可能

  • せいげんじょうけん
  • 拡張不可

  • 作成方法
  • 基本タイプはWrapperクラスを追加する必要があります.
  • 生成器を明示的に生成することもできる.
  • の静的変数もあります.
  • メソッドを生成することもできる.
  • public record Person(
        String name,
        Integer age,
        Job job
    ) { 
    	public Person{
      	//Do Something
      }
      
      public static int test = 100;
    
      public void testUp() {
          test++;
      }
    
      public static int getTest() {
          return test;
      }
      
      private void testDown() {
          test--;
      }
    }

  • Jsonとして作成
    JsonはJackson-databindで作成できます.
    public record Person2(
        @JsonProperty("Name") String name,
        @JsonProperty Integer age,
        @JsonIgnore Job job
     ) {}
     
     Main에서
     Person person = new Person("Arakene", 25, new Job("Android Developer"));
     ObjectMapper mapper = new ObjectMapper();
     String json = mapper.writeValueAsString(person);
    実行結果
    {"Name":"Arakene","age":25}
  • Microbenchmark Suite


  • パフォーマンステストのツールの1つとして、JMH(Java MicroBenchmark Harness)が命名されています.

  • 依存の設定
            <dependency>
                <groupId>org.openjdk.jmh</groupId>
                <artifactId>jmh-core</artifactId>
                <version>1.32</version>
            </dependency>
            <dependency>
                <groupId>org.openjdk.jmh</groupId>
                <artifactId>jmh-generator-annprocess</artifactId>
                <version>1.32</version>
            </dependency>

  • テストコード
    @State(Scope.Thread)
    @OutputTimeUnit(TimeUnit.MILLISECONDS)
    public class BenchMarkTest {
    
       int max = 999;
       List<Integer> testList = new ArrayList<>();
    
       @Setup //테스트 전 준비 과정
       public void set(){
           for (int i = 0; i < max; i++) {
               testList.add(i);
           }
       }
       @BenchmarkMode(Mode.AverageTime)
       @Benchmark //테스트할 메소드
       public void originLoopWithGetSize() {
           int sum = 0;
           for (int i = 0; i < max; i++) {
               sum += testList.get(i);
           }
       }
    }
    public static void main(String[] args) throws IOException, RunnerException {
           Options opt = new OptionsBuilder()
                   .include(BenchMarkTest.class.getSimpleName())
                   .forks(1)                       
                   .build();
           new Runner(opt).run();                 
    }

  • Annotations
  • @State
    テストに使用するパラメータのステータスを指定できます.テストが進むにつれて、値を変更する必要があるか、常に同じ値を@Stateとして指定する必要がある場合があります.
  • Thread->Threadでインスタンス
  • を作成
  • Benchmark->同じテストのすべてのThreadで同じインスタンス(マルチスレッドテスト)
  • を共有
  • グループ->各Threadグループのインスタンス
  • を作成
  • @BenchMark
    ベンチマークテストをどのように実行しますか.
  • スループット->1秒あたりの測定タスク数、デフォルトは
  • です.
    平均運転時間
  • AverageTie->測定
  • SampleTime->最長、最短時間などのタスクに必要な時間測定
  • SingleShotTime->単一タスクの実行時間を測定し、JVM Warmupなしで
  • を取得
  • All->以上4つすべて
  • を実行
  • @OutputTimeUnit
    出力結果に使用する時間単位を設定し、TimeUnitクラスを使用
  • Nano->デフォルト
  • @Setup, @TearDown
    どちらもメソッドに適用され,@SetupはJunitのBeforeと同じである.実行前の設定をテストします.@TerDownはJunitのAfterなどの仕事をしています.テスト後の処理に使用します.両方ともレベルを設定できます.
  • Trial->データムを実行するたびに
  • が呼び出されます.
  • 反復->データムテストを繰り返すときに呼び出される
  • 業界->基準メソッドを呼び出すたびに
  • を呼び出す

  • Options
    Annotationでは複数の基準を設定できますが、Optionで調整することもできます.
    Options opt = new OptionsBuilder()
                    .include(BenchMarkTest.class.getSimpleName())
                    .warmupIterations(1)          
                    .measurementIterations(1)     
                    .forks(1)
                    .build();
    new Runner(opt).run(); 
  • Text Blocks


    マルチテキスト文字列は良い機能です.
  • 既存文字列
       String query = "SELECT \"name\", \"email\" FROM \"users\"\n" +
              "WHERE \"username\" = 'kbh';";
  • アプリケーション
  • テキストブロック
       String  query = """
       	SELECT "name", "email" FROM "users"
         	WHERE "username" = 'kbh';
         	""".stripIndent();
  • ホワイトスペースもあるので、最後は必ずstripIndent()を使います.
    不要なスペースを外して、欲しいデータだけを入れることができます.
  • Helpful NullPointerException


  • 既存NPE
    従来のチェーンメソッドではnpeが発生すると,具体的にどこで発生するか分からない.

  • JDK 14以降
    String name = person.personDetails.name;
    를 실행한 경우
    Exception in thread "main" java.lang.NullPointerException: Cannot read field "name" because "person.personDetails" is null
    			at Main.main(Main.java:6)
    와 같이 어디서 null이 나온건지 알 수 있다.

  • 使用方法
    Intellij規格
    VMオプションに-XX:+ShowCodeDetailsInExceptionメッセージを追加すればよい.


  • 結果の使用
    String name = person.personDetails.name;
    이 코드를 실행시키면
    Exception in thread "main" java.lang.NullPointerException: Cannot read field "name" because "person.personDetails" is null
    			at Main.test(Main.java:42)
    			at Main.main(Main.java:24)
    
    peronalDetails가 null 인지 name이 null인지 알 수 있다.