مُنشئ صريح باستخدام لومبوك؟
سؤال
أقوم بإعادة كتابة بعض التعليمات البرمجية الفوضوية التي تدير قاعدة بيانات ، ورأيت أن المبرمج الأصلي قد أنشأ فئة تم تعيينها إلى قاعدة البيانات مثل SO:
(لقد قمت بإزالة التعليمات البرمجية غير الضرورية التي ليس لها غرض في هذا السؤال)
@Entity
@Data
@EqualsAndHashCode(callSuper = false, of = { "accessionCode", "header", "date" })
@SuppressWarnings("PMD.UnusedPrivateField")
public class PDBEntry implements Serializable {
@Id
@NaturalId
@NotEmpty
@Length(max = 4)
private String accessionCode;
@NaturalId
@NotEmpty
private Date date;
@NaturalId
// We allow for the header to be 'null'
private String header;
private Boolean isValidDssp;
@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdated = new Date(System.currentTimeMillis());
protected PDBEntry(){}
public PDBEntry(String accessionCode, String header, Date date){
this.accessionCode = accessionCode;
this.header = header;
this.date = date;
}
}
ما زلت مبتدئًا في Hibernate وأستخدم Lombok ، لكن ألا يفعل هذا الشيء نفسه ولن يقوم Lombok تلقائيًا بإنشاء مُنشئ مطلوب لك؟
@Entity
@Data
@SuppressWarnings("PMD.UnusedPrivateField")
public class PDBEntry implements Serializable {
@Id
@NaturalId
@NotEmpty
@NonNull
@Length(max = 4)
private String accessionCode;
@NaturalId
@NotEmpty
@NonNull
private Date date;
@NaturalId
// We allow for the header to be 'null'
private String header;
private Boolean isValidDssp;
@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdated = new Date(System.currentTimeMillis());
}
أيضًا ، يقول المبرمج الأصلي لهذا الرمز إنه يسمح للرأس بأن يكون "فارغًا" ، ومع ذلك قام بإنشاء مُنشئ بشكل صريح يحتاج إلى قيمة للرأس. هل أفتقد شيئًا أم أن هذا متناقض بعض الشيء؟
المحلول
القي نظرة على @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
.
سلوك مُنشئ @Data
يشبه @RequiredArgsConstructor
:
REQUIRERGSCONSTRUCTOR يولد مُنشئًا مع معلمة واحدة لكل حقل يتطلب معالجة خاصة. تحصل جميع الحقول النهائية على معلمة ، وكذلك أي حقول يتم تمييزها على أنها nonnull التي لم يتم تهيئتها حيث يتم إعلانها.
بالنظر إلى أن أيا من حقولك هي إما final
أو @NonNull
, ، سيؤدي هذا إلى مُنشئ حدوث. ومع ذلك ، فإن هذه ليست الطريقة الأكثر تعبيرية لتحقيق هذا السلوك.
ما تريده في هذه الحالة هو أ @NoArgsConstructor
(اختياريا مع أ @AllArgsConstructor
) ، لتوصيل السلوك المقصود بوضوح ، كما هو موضح أيضًا في الوثائق:
تتطلب بعض بنيات Java ، مثل Hibernate وواجهة موفر الخدمة مُنشئًا لـ ARGS. هذا الشروح مفيد في المقام الأول مع إما @data أو أحد التعليقات التوضيحية لتوليد المنشئ الأخرى.
نصائح أخرى
هذا الشيء متناقض أنت على حق. لم أستخدم Lombok من قبل ولكن مع السبات إذا كنت تريد أن تكون قادرًا على إنشاء فول واستمر ، فأنت بحاجة إلى مُنشئ الافتراض على النحو الوارد أعلاه حتى كنت على علم. ويستخدم Constructor.newinstance () لإنشاء كائنات جديدة.
فيما يلي بعض الوثائق السباتية التي تدخل في مزيد من التفاصيل.
إذا كنت تستخدم data مع حقل @Nonnull وما زلت تريد أن يكون NOARGS-Constructor ، فقد ترغب في محاولة إضافة كل التعليقات التوضيحية الثلاثة معًا
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
على ما يبدو قديم intellij الخطأ الذي قمت بتكراره في Eclipse Kepler و Lombok V0.11.4
@NoArgsConstructor,
@RequiredArgsConstructor,
@AllArgsConstructor
قم بإنشاء مُنشئين لا يأخذون أي حجج أو حجة واحدة لكل حقل نهائي / غير فائق أو حجة واحدة لكل حقل. اقرا هذا Lombok-Project
@Data
@RequiredArgsConstructor /*Duplicate method Someclass() in type Someclass*/
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true) /*Duplicate method Someclass() in type Someclass*/
@Entity
public class Someclass {
@Id
private String id;
private String name;
private Type type;
public static enum Type { X , Y, Z}
}
تم إصلاحه من خلال جعل المتغيرات الأعضاء نهائية
@Data
@RequiredArgsConstructor
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)
@Entity
public class Someclass {
@Id
private final String id;
private final String name;
private final Type type;
public static enum Type { X , Y, Z}
}