লম্বোক ব্যবহার করে একটি বিদ্যমান থেকে একটি অবজেক্ট তৈরি করুন


100

আসুন বলুন যে আমার মতো একটি লম্বোক এনোটেটেড ক্লাস রয়েছে

@Builder
class Band {
   String name;
   String type;
}

আমি জানি আমি করতে পারি:

Band rollingStones = Band.builder().name("Rolling Stones").type("Rock Band").build();

বিদ্যমান অবজেক্টটিকে টেমপ্লেট হিসাবে ব্যবহার করে এবং এর একটি বৈশিষ্ট্য পরিবর্তন করার জন্য ফু এর কোনও অবজেক্ট তৈরি করার কী সহজ উপায় আছে?

কিছুটা এইরকম:

Band nirvana = Band.builder(rollingStones).name("Nirvana");

লম্বোক ডকুমেন্টেশনে এটি খুঁজে পাচ্ছি না।

উত্তর:


223

toBuilderআপনার দৃষ্টান্তগুলিকে একটি toBuilder()পদ্ধতি দিতে আপনি প্যারামিটারটি ব্যবহার করতে পারেন ।

@Builder(toBuilder=true)
class Foo {
   int x;
   ...
}

Foo f0 = Foo.builder().build();
Foo f1 = f0.toBuilder().x(42).build();

ডকুমেন্টেশন থেকে :

যদি আপনার নিজের শ্রেণীর উদাহরণ তৈরি করতে বিল্ডারদের জেনারেট করতে @ বিল্ডার ব্যবহার করা হয় (তবে এটির ক্ষেত্রে @ বিল্ডারকে এমন কোনও পদ্ধতিতে যুক্ত করা না হয় যা আপনার নিজস্ব ধরণের ফেরত দেয় না), আপনি জেনারেট করতে @ বিল্ডার (টু বিল্ডার = সত্য) ব্যবহার করতে পারেন আপনার ক্লাসে একটি উদাহরণ পদ্ধতি যা বিল্ডারকে বলা হয় (); এটি একটি নতুন নির্মাতা তৈরি করে যা এই উদাহরণটির সমস্ত মান দিয়ে শুরু হয়।

দাবি অস্বীকার: আমি লম্বোক বিকাশকারী।


11
@Mustafa এর রয়েছে @Wither, যা একক ক্ষেত্র পরিবর্তনের জন্য আরও দক্ষ হল: Foo f1 = f0.withX(42)
মার্টিনাস

@ maaartinus আমি মনে করি @Witherযে * পদ্ধতির সাথে উত্পন্ন হয় যা বিদ্যমান অবজেক্টের ক্ষেত্রটি নির্ধারণের পরিবর্তে সর্বদা একটি নতুন অবজেক্ট ফিরিয়ে দেয়। এটি স্বল্প দক্ষতার।
এমজিহস্টসফট

4
@ এমজিহসটসফ্ট আমি স্পষ্টতই ধরে নিচ্ছি যে একটি নতুন অবজেক্ট তৈরি করা তার লক্ষ্য। এইভাবে আমাদের অপরিবর্তনীয় বস্তু হিসাবে বেশি সাধারণ ব্যবহার করা হয়। ++ a একটি একক ক্ষেত্র পরিবর্তনের জন্য, @Witherসেরা। দুই জনেরও বেশি ভোট পেল, toBuilderজিতল। আমার উত্তর নীচে দেখুন।
মার্টিনাস

4
এবং শূন্য ক্ষেত্রগুলির জন্য (অর্থাত্ কোনও পরিবর্তন ছাড়াই কোনও অবজেক্ট অনুলিপি), @Witherতেমন কাজ করবে না .toBuilder().build()
এম জাস্টিন

38

সেখানে একটি সহজ উপায় টেমপ্লেট রূপে বিদ্যমান বস্তুর ব্যবহার করে এবং পরিবর্তন foo বিন্যাস একটি বস্তু তৈরি করা এক এটা বৈশিষ্ট্য? ( জোর আমার )

আপনি যদি সত্যই কোনও একক সম্পত্তি পরিবর্তন করতে চান তবে একটি সুন্দর এবং আরও কার্যকর উপায় আছে:

@With
class Band {
   String name;
   String type;
}

Band nirvana = rollingStones.withName("Nirvana");

শুকনো কোনও আবর্জনা তৈরি করে না, তবে এটি কেবল একটি একক ক্ষেত্র পরিবর্তন করতে পারে। অনেক ক্ষেত্র পরিবর্তন করার জন্য, আপনি ব্যবহার করতে পারেন

withA(a).withB(b).withC(c)....

এবং প্রচুর পরিমাণে আবর্জনা উত্পাদন (সমস্ত মধ্যবর্তী ফলাফল) তবে এর চেয়ে toBuilderবেশি দক্ষ এবং আরও প্রাকৃতিক।

দ্রষ্টব্য: লম্বকের পুরানো সংস্করণগুলি @Witherটীকাটি ব্যবহার করেছে । ডকুমেন্টেশনের শুরু দেখুন ।


4
এটা কি সত্যিই এত আবর্জনা তৈরি করতে পারে? আমার মনে হয় আপনি যে ক্ষেত্রটি প্রতিস্থাপন করছেন তা বাদে এগুলি সমস্ত অগভীর অনুলিপি (এই ধারণার উপর নির্ভর করে যে আপনি যদি ইতিমধ্যে বস্তুটিকে অপরিবর্তনীয় করে তুলবেন তবে তা যদি উদ্দেশ্য হয়)। "আবর্জনা" হ'ল মূলত ফেলে দেওয়া শীর্ষ স্তরের অবজেক্টের রেফারেন্স হবে (যদিও আমি ধারণা করি যে অনেক আদিম ফলাফল আরও আবর্জনাও পেতে পারে)।
jm0

4
@ জেএম0 অবশ্যই, এটি সমস্ত অগভীর কপি। "টন আবর্জনা" দ্বারা আমি বোঝাচ্ছি n-1ধারাবাহিক nকল করার জন্য অবজেক্টগুলি withSomething। কোনও সামগ্রীর জন্য কিছু বাইটের সাথে রেফারেন্সের জন্য 4 বা 8 বাইট প্লাসের সাথে আদিম প্রতি 1 থেকে 8 বাইটের মতো কিছু খরচ হয়। সুতরাং আমরা প্রতি কল প্রতি দশটি বাইট সম্পর্কে কথা বলছি। সাধারণত কোনও বড় বিষয় নয়।
মার্টিনাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.