سؤال

أقوم بإعادة كتابة بعض التعليمات البرمجية الفوضوية التي تدير قاعدة بيانات ، ورأيت أن المبرمج الأصلي قد أنشأ فئة تم تعيينها إلى قاعدة البيانات مثل 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}
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top