জাভা একটি কনস্ট্রাক্টরে একটি ইন অ্যারের সূচনা করুন


91

আমার একটি ক্লাস আছে এবং সেই ক্লাসে আমার এটি রয়েছে:

 //some code
 private int[] data = new int[3];
 //some code

তারপরে আমার কনস্ট্রাক্টারে:

public Date(){
    data[0] = 0;
    data[1] = 0;
    data[2] = 0;
}

আমি যদি এটি করি তবে সবকিছু ঠিক আছে। ডিফল্ট ডেটা মানগুলি শুরু করা হয় তবে আমি পরিবর্তে এটি করলে:

public Date(){
    int[] data = {0,0,0};
}

এটা বলে:

Local variable hides a field

কেন?

কনস্ট্রাক্টরের ভিতরে কোন অ্যারে শুরু করার সর্বোত্তম উপায় কী?


আমি আশা করি আপনি ভেরিয়েবলের সুযোগের ধারণা সম্পর্কে সচেতন? আপনার পরিবর্তনশীল এর dataপরে "//some code"পুরো বর্গের সুযোগ রয়েছে। dataকনস্ট্রাক্টরের ভেরিয়েবলের কনস্ট্রাক্টরের ভিতরে স্কোপ থাকে। এবং একবার কনস্ট্রাক্টর হয়ে গেলে ভেরিয়েবলটি নষ্ট হয়ে যাবে। এবং dataকনস্ট্রাক্টরের ভিতরে ভেরিয়েবলও ক্লাসে একই নামে ভেরিয়েবলটি আড়াল করে। এটি ত্রুটিটিকে ন্যায়সঙ্গত করেLocal variable hides a field
নবীন বাবু

উত্তর:


180
private int[] data = new int[3];

এটি ইতিমধ্যে আপনার অ্যারে উপাদানগুলিকে 0 এ সূচনা করে You আপনার আর এটি নির্মাণকারীর মধ্যে পুনরাবৃত্তি করার দরকার নেই।

আপনার কনস্ট্রাক্টারে এটি হওয়া উচিত:

data = new int[]{0, 0, 0};

হ্যাঁ. এটিই আমাকে অনুমতি দেয় একমাত্র উপায়। শুধু তথ্য রাখা; "এটি একটি বিবৃতি নয়" বলেছিলেন। ধন্যবাদ
ফ্যাভোলাস

তিনি কি data=new int[3]খেলোয়াড় নির্মাণে ব্যবহার করতে পারবেন না Date()?
পার্সিকার

7

আপনি হয় করতে পারেন:

public class Data {
    private int[] data;

    public Data() {
        data = new int[]{0, 0, 0};
    }
}

যা dataকনস্ট্রাক্টরতে আরম্ভ করে, বা:

public class Data {
    private int[] data = new int[]{0, 0, 0};

    public Data() {
        // data already initialised
    }
}

যা dataকনস্ট্রাক্টরের কোডটি কার্যকর করার আগে আরম্ভ করে।


আমাকে ডেটা রাখতে হবে = নতুন ইনট [] {0,0,0}; কনস্ট্রাক্টর ভিতরে। যদি আমি কনস্ট্রাক্টরে কোডের আগে কেবল ডেটা রাখি; কনস্ট্রাক্টরের ভিতরে আমাকে "বিবৃতি নয়" ত্রুটি দেওয়া হয়েছিল
ফ্যাভোলাস

যদি অ্যারেতে মিলিয়নেরও বেশি উপাদান থাকে .. আপনি প্রথম কোডটি ব্যবহার করতে চান এবং নিক্ষেপ করা public Data() throws Error {হলে লাইন পরিবর্তন OutOfMemoryErrorকরতে পারেন ।
নিক

4

এটি কারণ, নির্মাণকারীতে, আপনি একটি বৈশিষ্ট্য হিসাবে একই নামের সাথে একটি স্থানীয় ভেরিয়েবল ঘোষণা করেছিলেন।

একটি পূর্ণসংখ্যা অ্যারে বরাদ্দ করতে যা সমস্ত উপাদান শূন্য থেকে শুরু করা হয়, এটি কনস্ট্রাক্টরে লিখুন:

data = new int[3];

অন্যান্য প্রাথমিক মান রয়েছে এমন একটি পূর্ণসংখ্যা অ্যারে বরাদ্দ করতে, এই কোডটি কনস্ট্রাক্টরে রাখুন:

int[] temp = {2, 3, 7};
data = temp;

বা:

data = new int[] {2, 3, 7};

4

কেন সহজভাবে না

public Date(){
    data = new int[]{0,0,0};
}

আপনি ত্রুটিটি পেয়েছেন কারণ হ'ল int[] data = ...একটি নতুন ভেরিয়েবল ঘোষণা করে এবং ক্ষেত্রটি আড়াল করেdata

তবে এটি লক্ষ করা উচিত যে অ্যারের সামগ্রীগুলি ইতিমধ্যে 0 (এর ডিফল্ট মান int) এ শুরু হয়েছে


1

আপনার কনস্ট্রাক্টরে আপনি অন্য কোনও আন্ত অ্যারে তৈরি করছেন:

 public Date(){
  int[] data = {0,0,0};
  }

এটা চেষ্টা কর:

 data = {0,0,0};

দ্রষ্টব্য: উপায় দ্বারা আপনাকে যদি আপনার অ্যারে উপাদানগুলি ইন্সট্যান্স ভেরিয়েবল হিসাবে ঘোষণা করা হয় তবে তা আরম্ভ করার দরকার নেই। ইনস্ট্যান্স ভেরিয়েবলগুলি স্বয়ংক্রিয়ভাবে তাদের ডিফল্ট মানগুলি পায় যা একটি পূর্ণসংখ্যার অ্যারের জন্য, ডিফল্ট মানগুলি সব শূন্য।

আপনি যদি স্থানীয়ভাবে অ্যারে ঘোষণা করে থাকেন তবে তাদের প্রতিটি উপাদানকে আরম্ভ করার প্রয়োজন হবে।


0

সর্বোত্তম উপায় হ'ল কোনও আরম্ভের বিবৃতি না লেখাই। এর কারণ এটি যদি আপনি int a[]=new int[3]ডিফল্টরূপে লিখেন , জাভাতে অ্যারের সমস্ত মানগুলি a[0], a[1]এবং এতে a[2]আরম্ভ হয় 0! স্থানীয় ভেরিয়েবলটি কোনও ক্ষেত্রটি আড়াল করে রাখার বিষয়ে, আমাদের সিদ্ধান্তে আসার জন্য আপনার সম্পূর্ণ কোডটি পোস্ট করুন।

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