record Outer(int a) { record Nest(int b) { } }
ãããªãã¨ãããã©ããªããã ããã¨æ°ã«ãªãã¾ãã¦ã
record
ãåã«ã¯ã©ã¹ã®ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ã¼ã§ããã°ãNest
ã¯ã¤ã³ãã¼ã¯ã©ã¹ã«ãªãã®ã§Outer
ã®ã¤ã³ã¹ã¿ã³ã¹å¤æ°ãããã§ã¯ a
ã«ã¢ã¯ã»ã¹ã§ãããã§ãããåãªããã¹ãã¯ã©ã¹ã§ããã°ã¢ã¯ã»ã¹ã§ãã¾ããã
çµè«ã¨ãã¦ã¯Nest
ããa
ã«ã¯ã¢ã¯ã»ã¹ã§ãããNest
ã¯Outer
ã®ã¤ã³ã¹ã¿ã³ã¹ãæããªããstatic
ãçç¥ããã¦ããã¨è¨ããã¨ã«ãªãã¾ãã
ãã¹ãã ã®ã¤ã³ãã¼ã ã®ã¯ å¿åã¯ã©ã¹ã¨ããã¼ã«ã«ã¯ã©ã¹ã¨ã ãåç §ãã ããã
確èªã¯Nest
ã®æ¹ã«ã¡ã½ããçããã¦Outer
ã®ã¤ã³ã¹ã¿ã³ã¹ã¡ã³ãã«ã¢ã¯ã»ã¹ãã¦ã¿ããã¨ããã°ãããã§ãããä»ã«ãNest
ãjavap
ããªãã¬ã¯ã·ã§ã³ã§ã³ã³ã¹ãã©ã¯ã¿ããã£ã¼ã«ããè¦ã¦ãOuter
ããããã©ãããè¦ãã°ãããã¾ãã
ãããä»ã§ãã©ããªããã ãï¼ã¨ãããªã®æ¸ãã¦ç¢ºèªã
class OuterClass { class NestClass { } interface NestInterface { } enum NestEnum { } record NestRecord() { } static class StaticNestClass { } static interface StaticNestInterface { } static record StaticNestRecord() { } static enum StaticNestEnum { } } enum OuterEnum { CONSTANT; class NestClass { } interface NestInterface { } enum NestEnum { } record NestRecord() { } static class StaticNestClass { } static interface StaticNestInterface { } static record StaticNestRecord() { } static enum StaticNestEnum { } } public interface OuterInterface { class NestClass { } interface NestInterface { } enum NestEnum { } record NestRecord() { } static class StaticNestClass { } static interface StaticNestInterface { } static record StaticNestRecord() { } static enum StaticNestEnum { } } record OuterRecord(String s) { class NestClass { } interface NestInterface { } enum NestEnum { } record NestRecord() { } static class StaticNestClass { } static interface StaticNestInterface { } static record StaticNestRecord() { } static enum StaticNestEnum { } }
ã§ãå ¨é¨ã®ã³ã³ã¹ãã©ã¯ã¿èãã¦åºåãã¤ã³ã¿ãã§ã¼ã¹ã¯ã³ã³ã¹ãã©ã¯ã¿ç¡ãããåºãªããã©ãã
String[] targets = {"Class", "Interface", "Enum", "Record"}; record OuterAndNest(String outer, String nest) { Class<?> nestClass() { try { return Class.forName(nest); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } } Arrays.stream(targets) .map(outer -> "Outer" + outer) .peek(System.out::println) .flatMap(outer -> Stream.concat( Arrays.stream(targets).map(nest -> new OuterAndNest(outer, outer + "$Nest" + nest)), Arrays.stream(targets).map(nest -> new OuterAndNest(outer, outer + "$StaticNest" + nest)) )) .forEach(e -> { Class<?> nestClass = e.nestClass(); System.out.println(" " + nestClass); Arrays.stream(nestClass.getDeclaredConstructors()) .forEach(constructor -> { System.out.println(" " + constructor); }); });
çµæã
OuterClass class OuterClass$NestClass OuterClass$NestClass(OuterClass) interface OuterClass$NestInterface class OuterClass$NestEnum private OuterClass$NestEnum(java.lang.String,int) class OuterClass$NestRecord OuterClass$NestRecord() class OuterClass$StaticNestClass OuterClass$StaticNestClass() interface OuterClass$StaticNestInterface class OuterClass$StaticNestEnum private OuterClass$StaticNestEnum(java.lang.String,int) class OuterClass$StaticNestRecord OuterClass$StaticNestRecord() OuterInterface class OuterInterface$NestClass public OuterInterface$NestClass() interface OuterInterface$NestInterface class OuterInterface$NestEnum private OuterInterface$NestEnum(java.lang.String,int) class OuterInterface$NestRecord public OuterInterface$NestRecord() class OuterInterface$StaticNestClass public OuterInterface$StaticNestClass() interface OuterInterface$StaticNestInterface class OuterInterface$StaticNestEnum private OuterInterface$StaticNestEnum(java.lang.String,int) class OuterInterface$StaticNestRecord public OuterInterface$StaticNestRecord() OuterEnum class OuterEnum$NestClass OuterEnum$NestClass(OuterEnum) interface OuterEnum$NestInterface class OuterEnum$NestEnum private OuterEnum$NestEnum(java.lang.String,int) class OuterEnum$NestRecord OuterEnum$NestRecord() class OuterEnum$StaticNestClass OuterEnum$StaticNestClass() interface OuterEnum$StaticNestInterface class OuterEnum$StaticNestEnum private OuterEnum$StaticNestEnum(java.lang.String,int) class OuterEnum$StaticNestRecord OuterEnum$StaticNestRecord() OuterRecord class OuterRecord$NestClass OuterRecord$NestClass(OuterRecord) interface OuterRecord$NestInterface class OuterRecord$NestEnum private OuterRecord$NestEnum(java.lang.String,int) class OuterRecord$NestRecord OuterRecord$NestRecord() class OuterRecord$StaticNestClass OuterRecord$StaticNestClass() interface OuterRecord$StaticNestInterface class OuterRecord$StaticNestEnum private OuterRecord$StaticNestEnum(java.lang.String,int) class OuterRecord$StaticNestRecord OuterRecord$StaticNestRecord()
ãããã¥ãããã flatMap
ã®å¾ã§é©å½ã« filter
ãã¨ãã
.filter(e -> Arrays.stream(e.nestClass().getDeclaredConstructors()) .anyMatch(constructor -> Arrays.stream(constructor.getParameterTypes()) .anyMatch(parameterType -> parameterType.getName().equals(e.outer()))))
çµæã
OuterClass class OuterClass$NestClass OuterClass$NestClass(OuterClass) OuterInterface OuterEnum class OuterEnum$NestClass OuterEnum$NestClass(OuterEnum) OuterRecord class OuterRecord$NestClass OuterRecord$NestClass(OuterRecord)
ã¨ã³ã¯ãã¼ã¸ã³ã°ã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãåããããã«ã³ã³ã¹ãã©ã¯ã¿ãå¼ãããã®ã¯ class
ã®æã ããã¨è¨ããã¨ã§ã
ãã£ãã
- IntelliJ IDEA 2021.2.3
IntelliJ IDEAãããè¦åãã¦ãããªãã£ãã®ãããStaticNestInterface
ãStaticNestEnum
ã¯static
è¦ããªãã£ã¦ç°è²ã§ãNestClass
ã¯static
ã«ã§ãããã£ã¦é»è²ã§ã
ããã£ã¦ããªãã¦ãæå³ãªãã®ãªãç°è²ã«ãªãããããªãããªããåºãªãã£ã¦ãã¨ã¯éãããã®ããªããã£ã¦æã£ãã®ã ãã©ãé»è²ã«ããªã£ã¦ãªãã®ã§ã
ãããä¸å¾ãã£ã¦ããªãã¦ãæå³ãªãã®ã«ç°è²ã«ãã¦ããããããªãããenum
ã®ä¸è¦ãªä¿®é£¾åãã¿ãããªæ¬ããªã®ãããªãã»ã©ã
ãªãinterface
ã«ãã¹ãããå ´åã¯å
¨é¨ã®staticãç°è²ã«ãªã£ã¦ããã¾ããããã¯interface
ã®ã¡ã³ãã«å¯¾ããä¸è¦ãªä¿®é£¾åã§å¼ã£ããã£ã¦ã模æ§ã
æºè¶³ãï¼è¨èªä»æ§ã¨ãè¦ã«è¡ãæ°åã¯æ®ã£ã¦ãªãï¼
IntelliJ IDEAãã㯠IDEA-266665 ã§fixæ¸ã ã£ãã 2021.3
ã«ãªã£ããæå¾
ãã¦ãéãã«ãªãããã