কিভাবে লম্বোকে সুপার কনস্ট্রাক্টর কল করবেন


118

আমার একটা ক্লাস আছে

@Value
@NonFinal
public class A {
    int x;
    int y;
}

আমার আরেকটা ক্লাস বি

@Value
public class B extends A {
    int z;
}

লম্বোক ত্রুটি ছুঁড়ে বলেছে এটি কন্সট্রাক্টরকে খুঁজে পাচ্ছে না, স্পষ্টভাবে এটি বলুন যে আমি লম্বোকের কাজটি করতে চাই ক্লাস বিতে টীকা দেওয়া যাতে এটি নিম্নলিখিত কোডটি উত্পন্ন করে:

public class B extends A {
    int z;
    public B( int x, int y, int z) {
        super( x , y );
        this.z = z;
    }
}

লমবকে এটি করার জন্য কি আমাদের কোনও টিকা আছে?

উত্তর:


169

এটি লম্বোকে সম্ভব নয়। যদিও এটি সত্যিই দুর্দান্ত বৈশিষ্ট্য হবে তবে এটি সুপার ক্লাসের নির্মাতাদের সন্ধানের জন্য রেজোলিউশন প্রয়োজন requires লম্বোকের আহ্বানের মুহুর্তেই সুপার ক্লাসটি কেবল নামেই পরিচিত। আসল ক্লাসটি অনুসন্ধান করতে আমদানি বিবৃতি এবং ক্লাসপাথ ব্যবহার করা তুচ্ছ নয়। এবং সংকলনের সময় আপনি কেবল নির্মাণকারীর একটি তালিকা পেতে প্রতিবিম্ব ব্যবহার করতে পারবেন না।

এটি সম্পূর্ণরূপে অসম্ভব নয় কিন্তু রেজল্যুশন ব্যবহার ফলাফল valএবং @ExtensionMethod'তাতে আমাদের শেখানো হয়েছে এটি হার্ড এবং ত্রুটি-প্রবণ।

প্রকাশ: আমি লম্বোক বিকাশকারী।


@ রোল-স্পিলকার আমরা এর পিছনে জটিলতাগুলি বুঝতে পারি। তবে লম্বোক কি inConstructorকনস্ট্রাক্টর টীকাগুলির জন্য এমন কোনও পদ্ধতি সরবরাহ করতে পারে যেখানে আমরা নির্ধারণ করতে পারি superযে উত্পাদিত কনস্ট্রাক্টরে লম্বোকের কোন কনস্ট্রাক্টর ইনজেক্ট করবে?
মনু মঞ্জুনাথ

1
পরে কনস্ট্রাক্টর কিছুটা স্বয়ংক্রিয় সূচনা করতেও ভাল হবে
পাভেল

@ মনু / @ পাওয়েল: লম্বক বর্ধনের অনুরোধটি দেখুন: github.com/peichhorn/lombok-pg/issues/78 (বর্তমানে উন্মুক্ত)
জেজে জবকর

যেহেতু @ বিল্ডার অফিশিয়াল রিলিজে আছেন: github.com/rzwitserloot/lombok/issues/853
সেবাস্তিয়ান

4
তবুও কি সম্ভব হচ্ছে না?
FearX

21

লম্বোক ইস্যু # 78 এই পৃষ্ঠার রেফারেন্স https://www.donneo.de/2015/09/16/lomboks-builder-annotation-and-inheritance/ এর এই সুন্দর ব্যাখ্যা সহ:

@AllArgsConstructor 
public class Parent {   
     private String a; 
}

public class Child extends Parent {
  private String b;

  @Builder
  public Child(String a, String b){
    super(a);
    this.b = b;   
  } 
} 

ফলস্বরূপ আপনি এরপরে উত্পন্ন উত্পাদককে এটি ব্যবহার করতে পারেন:

Child.builder().a("testA").b("testB").build(); 

সরকারী ডকুমেন্টেশন এই ব্যাখ্যা, কিন্তু এটি স্পষ্টভাবে নির্দেশ নয় যে আপনি এটি এই ভাবে সহজতর করতে পারেন।

আমি স্প্রিং ডেটা জেপিএর সাথে এটি দুর্দান্তভাবে কাজ করে দেখলাম।


আপনি কি স্প্রিং ডেটা জেপিএ ব্যবহার করে এর উদাহরণ সরবরাহ করতে পারেন?
মার্ক জাম্পেটি

29
এটি প্রশ্নের কোনও উত্তর দেয় না। পরিবর্তে, এটি হাত দ্বারা কাজ করে, যখন প্রশ্নটি ছিল কীভাবে এটি তৈরি করা যায়। একই সময়ে, এটি @ বিল্ডারকে টেনে এনে পুরো বিষয়টি আরও বিভ্রান্তিকর করে তোলে, যা প্রশ্নের সাথে কিছু করার নেই।
জ্যাসপার

8
আসলে যারা তাদের উত্তরাধিকার কাঠামো তৈরি করতে চান এবং তারপরে বিল্ডার ব্যবহার করতে চান তাদের পক্ষে এটি খুব কার্যকর। এটি 99% কারণ আমি যাইহোক # লম্বক ব্যবহার করি। কখনও কখনও আমাদের কেবল আমাদের ইচ্ছা মতো কাজ করার জন্য হ্যান্ডক্রাফ্ট স্টাফগুলি করতে হয় o তাই ধন্যবাদ @ জেজে-জাবকর
বাবাজিদে যুবরাজ

কিন্তু তারপর; কেবল স্ব + পিতামাতার আরগ কনস্ট্রাক্টরকে কোড দিন। কোনও বিল্ডার ব্যবহার করার দরকার নেই
জুহ_

এটি এসটিএস এবং গ্রহনে কাজ করবে, তবে আপনি যখন নিজের অ্যাপ্লিকেশনটির জেআর ফাইল তৈরি করবেন, সম্ভবত এটি ব্যর্থ হবে। উত্তরাধিকারের জন্য আমি সুপারবিল্ডার, নির্মাতা উভয়কেই চেষ্টা করেছিলাম। দুজনেই ব্যর্থ হয়েছি। সতর্ক হোন !!
পি সতীশ প্যাট্রো

6

লোমবক কোনও @Valueএনোটোটেড শ্রেণি তৈরি করে final(যেমন আপনি ব্যবহার করে জানেন @NonFinal) তৈরি করে এটিও নির্দেশ করে না ।

আমি খুঁজে পাওয়া একমাত্র কার্যকারিতা হ'ল সমস্ত সদস্যকে নিজেরাই চূড়ান্ত ঘোষণা করা এবং @Dataপরিবর্তে টীকাটি ব্যবহার করা। এই সাবক্লাসগুলিকে এনেট করা দরকার @EqualsAndHashCodeএবং একটি সুস্পষ্ট সমস্ত আর্গ কন্সট্রাক্টর প্রয়োজন কারণ লোমবোক জানে না যে কীভাবে একটি সুপার ক্লাসের সমস্ত আরগ ব্যবহার করে একটি তৈরি করতে হবে:

@Data
public class A {
    private final int x;
    private final int y;
}

@Data
@EqualsAndHashCode(callSuper = true)
public class B extends A {
    private final int z;

    public B(int x, int y, int z) {
        super(x, y);
        this.z = z;
    }
}

বিশেষত সাবক্লাসের কনস্ট্রাক্টররা অনেক সদস্যের সাথে সুপারক্লাসগুলির জন্য সমাধানটিকে কিছুটা অস্বস্তিকর করে তোলে, দুঃখিত।


1
আপনি আরও কিছুটা ব্যাখ্যা করতে পারেন কেন "সাবক্লাসগুলি দ্বারা টীকা দেওয়ার প্রয়োজন @EqualsAndHashCode"? এই টীকাটি অন্তর্ভুক্ত নয় @Data? থেক্স :)
জেরার্ড বোশ

1
@ জেরার্ডবি @Dataসমান () এবং হ্যাশকোড () তৈরি করে তবে কোনও উত্তরাধিকার সম্পর্কে চিন্তা করে না। সুপারক্লাস সমান () এবং হ্যাশকোড () ব্যবহার করা হয়েছে তা নিশ্চিত করার জন্য আপনার কলসপার সহ সুস্পষ্ট প্রজন্মের প্রয়োজন
আর্ন বার্মিস্টার

5

অনেক সদস্যের সাথে সুপারক্লাসের জন্য আমি আপনাকে @ ডেলিগেট ব্যবহার করার পরামর্শ দিচ্ছি

@Data
public class A {
    @Delegate public class AInner{
        private final int x;
        private final int y;
    }
}

@Data
@EqualsAndHashCode(callSuper = true)
public class B extends A {
    private final int z;

    public B(A.AInner a, int z) {
        super(a);
        this.z = z;
    }
}

এটি একটি আকর্ষণীয় পদ্ধতির মত এটি!
অর্ণ বার্মিস্টার

@Delegateহয় @Target({ElementType.FIELD, ElementType.METHOD})AInner ক্ষেত্র হতে হবে A
বোরিসেলেক

3

শিশু শ্রেণির যদি অভিভাবকদের চেয়ে বেশি সদস্য থাকে তবে এটি খুব পরিষ্কার নয়, তবে সংক্ষিপ্তভাবে করা যেতে পারে:

@Data
@RequiredArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class User extends BaseEntity {
    private @NonNull String fullName;
    private @NonNull String email;
    ... 

    public User(Integer id, String fullName, String email, ....) {
        this(fullName, email, ....);
        this.id = id;
    }
}

@Data
@AllArgsConstructor
abstract public class BaseEntity {
   protected Integer id;

   public boolean isNew() {
      return id == null;
   }
}

3

লোমবকের ১.১৮ সংস্করণ @ সুপারবিল্ডার টীকাটি প্রবর্তন করেছে। আমরা আমাদের সমস্যাটি সহজ উপায়ে সমাধান করতে এটি ব্যবহার করতে পারি।

আপনি https://www.baeldung.com/lombok-builder-inheritance#lombok-builder-and-inheritance-3 দেখুন

সুতরাং আপনার শিশু শ্রেণিতে আপনার এই টিকাগুলি লাগবে:

@Data
@SuperBuilder
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)

আপনার অভিভাবক শ্রেণিতে:

@Data
@SuperBuilder
@NoArgsConstructor

0

বিকল্প হিসাবে আপনি com.fasterxml.jackson.databind.ObjectMapperপিতামাতার কাছ থেকে একটি শিশু শ্রেণি আরম্ভ করতে ব্যবহার করতে পারেন

public class A {
    int x;
    int y;
}

public class B extends A {
    int z;
}

ObjectMapper MAPPER = new ObjectMapper(); //it's configurable
MAPPER.configure( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false );
MAPPER.configure( SerializationFeature.FAIL_ON_EMPTY_BEANS, false );

//Then wherever you need to initialize child from parent:
A parent = new A(x, y);
B child = MAPPER.convertValue( parent, B.class);
child.setZ(z);

lombokআপনার প্রয়োজন হলে আপনি এ এবং বি তে যে কোনও টিকা ব্যবহার করতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.