Unknown Region

プログラムでハマったエラーとその解決方法についての備忘録メモ

【JavaScript】指定した文字数のランダムな英数字文字列を生成する

備忘録がてら。

以下のプログラムは200文字のランダムな英数字文字列を生成する。

例: test.js

let length = 200; // わかりやすく代入しているが、直指定すればワンライナーで書ける。
let str = Array.from({"length": length}, (v, k) => k)
     .map(e => Math.random())
     .map(e => e.toString(32))
     .map(e => e.substring(2))
     .map(e => e[0])
     .join('');
console.log(str); // 5vs1p7cs56obf6h6qq19kp3sdeo4a94io4iev4b4rc8fu745rlap9n69h3324qr90mari3jr287o744pervirflvhgrsm7oa4ps85u16k86ch3nn725de9quvvj89lhph6mdhn72aob9fc0kq4avo4rdo02tfpr7905d86t4f96qlslhbdk92e7if4vf526h27pp722t

何に使えるかといえば、大量のテストデータの生成など。

このプログラムの周りにループなどをかましてやれば、大量に無作為な英数字文字列を生成することができる。

またバリデーションのテストなんかで、文字数の限界値チェック用の値に使える。

 

【Java】[java.util.Optional]における匿名クラスの扱いに気をつけよう

Javaの話。

※ Java8及びJava15にて事象を確認。

以下のプログラム(Test1.java)はコンパイルエラーが発生する。

例: Test1.java

import java.util.Optional;

public class Test1 {
  public static void main(String... args) {
    Object object = Optional.of(new Object(){})
      .orElse(new Object());
  }
}

例: Test1.javaコンパイルエラー

# javac Test.java
Test.java:6: error: incompatible types: Object cannot be converted to <anonymous Object>
      .orElse(new Object());
              ^

これは極端な例だが、取得するインスタンスのクラスがObjectクラスを拡張した匿名クラス[Optional.orElse()]の引数がObjectクラスインスタンスで、それぞれクラスが食い違っているために発生する。

これは[java.util.Optional.map()]を経た場合においても発生するので、実際にあり得そうな例としてはmap内で何かのクラス(例えばA)の匿名クラスインスタンスを生成し、[java.util.Optional.orElse()]には単純なAのインスタンスを指定した場合に発生しうると考えられる。

ただ、エラーメッセージが若干わかりにくいために遭遇すると困惑するかもしれない。

単純な解決方法としては[java.util.Optional.map()]にてキャストを挟めば良い。

例: Test2.java

import java.util.Optional;

public class Test2 {
  public static void main(String... args) {
    Object object = Optional.of(new Object(){})
      .map(Object.class::cast)
      .orElse(new Object());
  }
}

 

連絡先: plugout777★yahoo.co.jp (クローラー対策のため★を@に変更してください)