ITADN

Support for Java records

#313Openkjsmita6 创建于 2023-09-19
K
kjsmita6commented
Java 14 introduced the `record` keyword, which allows the creation of a lightweight "class" which really only holds data, similar to a `struct` in C for example. StringTemplate does not support records because the way records define fields/method is different. Say I have a record `Person` (with the equivalent class after it) defined as ```java /* * Lightweight Person record, only one line. */ public record Person(String name, int age) { // Nothing inside } /* * This class is equivalent to the record above, but much more code needs to be written. */ public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String name() { return this.name; } public int age() { return this.age; } } ``` The record will have two methods, `name()`, and `age()`, for getting the name and age fields. ```java Person person = new Person("John Doe", 30); assert "John Doe".equals(person.name()) && person.age() == 30; ``` --- Related to #302, the fields of a record are private, and the methods do not follow StringTemplate's `findMember` method search pattern of `getField`, `isField`, and `hasField`: ```java // try getXXX and isXXX properties, look up using reflection String methodSuffix = Character.toUpperCase(memberName.charAt(0)) + memberName.substring(1, memberName.length()); member = tryGetMethod(clazz, "get" + methodSuffix); if (member == null) { member = tryGetMethod(clazz, "is" + methodSuffix); if (member == null) { member = tryGetMethod(clazz, "has" + methodSuffix); } } if (member == null) { // try for a visible field member = tryGetField(clazz, memberName); } ``` The addition of a `tryGetMethod(clazz, memberName)` would solve this because the methods of a record are public. Or, fix the issue of #302, but doing this would help as well.
1 条评论