`বেসরকারী ভাল` এবং` ব্যক্তিগত চূড়ান্ত মানটি কেন আলাদা?


101

আমি স্ক্যাল রেফারেন্সের ৪.১ ধারা না পাওয়া পর্যন্ত আমি এটি ভাবতাম private valএবং private final valএকইরকম থাকতাম:

একটি ধ্রুবক মান সংজ্ঞা ফর্ম হয়

final val x = e

যেখানে ই একটি ধ্রুবক প্রকাশ (§6.24)। চূড়ান্ত সংশোধক অবশ্যই উপস্থিত থাকতে হবে এবং কোনও ধরণের টিকা দেওয়া যেতে পারে না। ধ্রুবক মান x এর উল্লেখগুলি তাদেরকে ধ্রুবক প্রকাশ হিসাবে গণ্য করা হয়; উত্পন্ন কোডে এগুলি সংজ্ঞাটির ডানদিকে ই দ্বারা প্রতিস্থাপিত হয়।

এবং আমি একটি পরীক্ষা লিখেছি:

class PrivateVal {
  private val privateVal = 0
  def testPrivateVal = privateVal
  private final val privateFinalVal = 1
  def testPrivateFinalVal = privateFinalVal
}

javap -c আউটপুট:

Compiled from "PrivateVal.scala"
public class PrivateVal {
  public int testPrivateVal();
    Code:
       0: aload_0       
       1: invokespecial #19                 // Method privateVal:()I
       4: ireturn       

  public int testPrivateFinalVal();
    Code:
       0: iconst_1      
       1: ireturn       

  public PrivateVal();
    Code:
       0: aload_0       
       1: invokespecial #24                 // Method java/lang/Object."<init>":()V
       4: aload_0       
       5: iconst_0      
       6: putfield      #14                 // Field privateVal:I
       9: return
}

স্কেল রেফারেন্স যেমনটি বলেছিল তেমনই বাইট কোডটি: private valএটি নয় private final val

কেন নেই scalac শুধু চিকিত্সা private valহিসাবে private final val? কোন অন্তর্নিহিত কারণ আছে?


29
অন্য কথায়: যেহেতু একটি valইতিমধ্যে অপরিবর্তনীয়, তাই স্ক্যালায় আমাদের finalকীওয়ার্ডের প্রয়োজন নেই কেন ? সংকলক কেন সমস্ত valএর সাথে একইভাবে আচরণ করতে পারে না final val?
জেস্পার

নোট করুন যে privateস্কোপ মডিফায়ার package privateজাভা হিসাবে একই শব্দার্থক আছে। আপনি বলতে চাইছেন private[this]
কনার ডয়েল

5
@ কননারডোয়েল: প্যাকেজটি ব্যক্তিগত হিসাবে? আমি এটি মনে করি না: এর privateঅর্থ এটি কেবল এই শ্রেণীর উদাহরণগুলির মধ্যে দৃশ্যমান, private[this]কেবল এই উদাহরণটি - একই শ্রেণীর উদাহরণগুলি ছাড়া , privateকাউকে (একই প্যাকেজ থেকে অন্তর্ভুক্ত) মানটি অ্যাক্সেস করতে দেয় না।
Make42

উত্তর:


83

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

জাভা অর্থে স্কালার একটি ভ্যাল ইতিমধ্যে চূড়ান্ত। দেখে মনে হচ্ছে স্কালার ডিজাইনাররা "ধ্রুবক মানের ইনলাইন করার অনুমতি" বোঝাতে রিডানড্যান্ট মডিফায়ার ফাইনালটি ব্যবহার করছেন। সুতরাং স্কালার প্রোগ্রামাররা হ্যাক্সের অবলম্বন না করে এই আচরণের উপর সম্পূর্ণ নিয়ন্ত্রণ রাখে: যদি তারা কোনও অন্তর্নিহিত ধ্রুবক চায়, এমন একটি মান যা কখনই পরিবর্তন হয় না তবে দ্রুত হয়, তারা "চূড়ান্ত ভাল" লেখেন। যদি তারা বাইনারি সামঞ্জস্যতা না ভাঙিয়ে মান পরিবর্তন করতে নমনীয়তা চান, কেবল "ভাল"।


9
হ্যাঁ, এটি বেসরকারী ভ্যালসগুলির কারণ, তবে প্রাইভেট ভলগুলি স্পষ্টতই অন্যান্য শ্রেণিতে অন্তর্ভুক্ত হতে পারে না এবং একইভাবে সামঞ্জস্যতাও ভেঙে ফেলতে পারে।
আলেক্সি রোমানভ

4
আমি যখন পরিবর্তন করি তখন সেখানে কোনও বাইনারি সামঞ্জস্যতার সমস্যা private valআছে private final val?
ইয়াং বো

4
@ স্টিভ-ওয়াল্ডম্যান আমাকে ক্ষমা করবেন, valআপনার দ্বিতীয় অনুচ্ছেদে কী বোঝাতে চাইছেন ?
ইয়াং বো

4
বাইনারি সামঞ্জস্যতা সম্পর্কিত জাভাতে চূড়ান্ত স্ট্যাটিক ভেরিয়েবলগুলির বিশদ এখানে রয়েছে - ডকস.অরাকল.com
মেডান

8

আমি মনে করি এখানে বিভ্রান্তিটি ফাইনালের শব্দার্থবিজ্ঞানের সাথে অবিচ্ছিন্নতা অবিচ্ছিন্নতা থেকে উদ্ভূত হয়েছিল। valগুলি শিশু শ্রেণিতে ওভাররাইড করা যেতে পারে এবং তাই স্পষ্টভাবে চিহ্নিত না করা হলে চূড়ান্ত হিসাবে বিবেচনা করা যাবে না।

@ ব্রায়ান আরইপিএল রেখার স্তরে শ্রেণি সুযোগ সরবরাহ করে। দেখা:

scala> $iw.getClass.getPackage
res0: Package = package $line3

scala> private val x = 5
<console>:5: error: value x cannot be accessed in object $iw
  lazy val $result = `x`

scala> private val x = 5; println(x);
5

4
আমি কথা বলছি private val। এটা কি ওভাররেড করা যায়?
ইয়াং বো

না, প্রাইভেট ভলগুলি ওভাররাইড করা যাবে না। আপনি একটি সাবক্লাসে একই নামের সাথে অন্য একটি ব্যক্তিগত ভ্যালকে নতুন সংজ্ঞা দিতে পারেন, তবে এটি সম্পূর্ণ ভিন্ন ভ্যাল যা কেবল একই নামটি হতে পারে। (
পুরানোটির সাথে সম্পর্কিত

4
এটি কেবল এই ওভাররিডিং আচরণ বলে মনে হয় না, যেহেতু আমি কোনও শ্রেণীর প্রসঙ্গেই না হয়ে দোভাষীর কাছে একটি চূড়ান্ত ভাল (বা এমনকি চূড়ান্ত ভার) তৈরি করতে পারি।
nairbv
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.