Используя IntelliJ IDEA, я хочу создать класс POJO, который поможет мне избежать глупых ошибок с точки зрения неправильного определения параметров.
- Меня не волнуют другие IDE
- Я не хочу использовать какую-либо форму отражения (т.е. никакой Ломбок или подобное)
- Я неЯ не забочусь о «лучших практиках»
Я просто хочу создать класс, объявить некоторые поля и иметь удобный способ созданиякласс, который уменьшает вероятность того, что при создании класса я получу неправильные параметры одного типа.
Начиная с этого:
public class TestObject {
public String x;
public String y;
}
Я хочу создать что-то, что я могу использоватьПримерно так:
TestObject o = new TestObject().setX("x").setY("y");
или вот так:
TestObject o = TestObjectBuilder.withX("x").withY("y").build();
Я не против, если есть отдельный класс конструктора (предпочитаю заклинить все методы исходного класса, но нетBiggie).
Я не против, если по пути будет много копий.Предпочитаю, если весь процесс создает только 1 экземпляр, как мое решение ниже;но если в решении используется неизменный подход «экземпляр-на-поле-установщик» - не важно.
Вот что я сейчас делаю для достижения этой цели.
(1) Используйте IDEA для Generate constructor
, выбирая все поля, в результате чего:
public class TestObject {
public String x;
public String y;
public TestObject(String x, String y) {
this.x = x;
this.y = y;
}
}
(2) Refactor Constructor with Builder
, необходимо выбрать Use existing
, затем скопировать /вставьте имя TestObject
в поле, потому что почему бы и нет, в результате чего:
public class TestObject {
public String x;
public String y;
public TestObject(String x, String y) {
this.x = x;
this.y = y;
}
public TestObject setX(String x) {
this.x = x;
return this;
}
public TestObject setY(String y) {
this.y = y;
return this;
}
public TestObject createTestObject() {
return new TestObject(x, y);
}
}
(3) Удалите конструктор вручную (поскольку его наличие запрещает использование ctor по умолчанию)и удалите метод createTestObject () (поскольку это излишне, Java дает мне метод клонирования бесплатно).Оставляя меня с этой маленькой красавицей, и это все, чего я хотел в первую очередь:
public class TestObject {
public String x;
public String y;
public TestObject setX(String x) {
this.x = x;
return this;
}
public TestObject setY(String y) {
this.y = y;
return this;
}
}
Как насчет Оби-Вана, переполнения стека, есть ли способ сделать это с меньшим количеством пфаффинга?
Еще одна вещь, которую я хотел бы сделать, это добавить поля с меньшими затратами.Сейчас, когда я добавляю поле, я generate setter
изменяю результат вручную, чтобы он соответствовал другим установщикам - есть ли лучший способ сделать это?