এ , ক , ক বা এ defদুটির মাধ্যমে প্রয়োগ করা যেতে পারে । সুতরাং এটি কোনও সদস্যকে সংজ্ঞায়নের সবচেয়ে বিমূর্ত রূপ। যেহেতু বৈশিষ্ট্যগুলি সাধারণত বিমূর্ত ইন্টারফেস হয়, আপনি যে চান তা বলছে বাস্তবায়নটি কীভাবে করা উচিত। আপনি যদি এর জন্য জিজ্ঞাসা করেন তবে একটি বাস্তবায়নকারী শ্রেণী একটি ব্যবহার করতে পারে না ।defvallazy valobjectvalvaldef
valআপনার যদি কেবল স্থিতিশীল শনাক্তকারী প্রয়োজন, তবে পথ-নির্ভর ধরণের জন্য প্রয়োজন হয় A এটি এমন কিছু যা আপনার সাধারণত প্রয়োজন হয় না।
তুলনা করা:
trait Foo { def bar: Int }
object F1 extends Foo { def bar = util.Random.nextInt(33) }
class F2(val bar: Int) extends Foo // ok
object F3 extends Foo {
lazy val bar = {
Thread.sleep(5000)
42
}
}
তোমার যদি থাকত
trait Foo { val bar: Int }
আপনি সংজ্ঞায়িত করতে পারবেন না F1বা F3।
ঠিক আছে, এবং আপনাকে বিভ্রান্ত করার জন্য এবং @ ওম-নাম-নাম-উত্তর ab বিমূর্ত ব্যবহার করে valসূচনা সমস্যার কারণ হতে পারে:
trait Foo {
val bar: Int
val schoko = bar + bar
}
object Fail extends Foo {
val bar = 33
}
Fail.schoko
এটি একটি কুরুচিপূর্ণ সমস্যা যা আমার ব্যক্তিগত মতামত অনুসারে ভবিষ্যতে স্কেলার সংস্করণগুলিতে সংকলকটিতে এটি ঠিক করে দূরে চলে যাওয়া উচিত, তবে হ্যাঁ, বর্তমানে এটিও একটি কারণ যার কারণে বিমূর্তটি ব্যবহার করা উচিত নয় val।
সম্পাদনা (জানুয়ারী ২০১)): আপনাকে valএকটি lazy valবাস্তবায়ন সহ একটি বিমূর্ত ঘোষণাকে ওভাররাইড করার অনুমতি দেওয়া হয় , যাতে এটি আরম্ভের ব্যর্থতাও রোধ করে।