ঘোষণার মধ্যে না থাকলে অ্যারের প্রারম্ভিককরণ বাক্য গঠন


141

আমি লিখতে পারি:

AClass[] array = {object1, object2}

আমি আরও লিখতে পারি:

AClass[] array = new AClass[2];
...
array[0] = object1;
array[1] = object2;

তবে আমি লিখতে পারি না:

AClass[] array;
...
array = {object1, object2};

কেন এটি জাভা দ্বারা অবরুদ্ধ?

আমি জানি যে এটির চারপাশে কীভাবে কাজ করা যায় তবে সময়ে সময়ে এটি সহজ হবে।

উদাহরণ স্বরূপ:

public void selectedPointsToMove(cpVect coord) {

    if (tab == null) {
        if (arePointsClose(coord, point1, 10)) {
            cpVect[] tempTab = {point1};
            tab = tempTab;
        } else if (arePointsClose(point2, coord, 10)) {
            cpVect[] tempTab = {point2};
            tab = tempTab;
        } else {
            cpVect[] tempTab = {point1,point2};
            tab = tempTab;
        }
    }
}

জাভাতে অ্যারেগুলির সাথে কীভাবে খেলতে হবে তা শিখার পর থেকেই এই সহজ প্রশ্নটি আমাকে বাগিয়ে দিচ্ছে।


পাঠ্য বিন্যাসের জন্য দুঃখিত তবে চীনে কোনও কারণে পাঠ্য বিন্যাসের বোতামগুলি উপস্থিত হয় না: এস
জেসন রজার্স

কোডের জন্য, এটি নিশ্চিত করুন যে এটি 4 টি স্পেস বা তারও বেশি সংখ্যায় যুক্ত রয়েছে।
মাদুর

অন্য সমস্যাটি হ'ল যে কোডটি আপনি পেস্ট করেছেন তাতে আপনার TAB অক্ষর রয়েছে। এটি ফরম্যাটিংটি মিস করে।
স্টিফেন সি

ওকি ধন্যবাদ, গ্রহপসটি ইনডেন্টেশনে ট্যাবগুলি ব্যবহার করে তাই আমি যখন অনুলিপি করি তখন এটি মুছে যায়। সম্পাদনার জন্য ধন্যবাদ
জেসন রজার্স

ইন্দেন্টেশনের জন্য TAB অক্ষর ব্যবহার না করার জন্য গ্রহনটি পুনরায় কনফিগার করা উচিত । অজুহাত হিসাবে এটি ব্যবহার করবেন না দয়া করে।
স্টিফেন সি

উত্তর:


137

কেন এটি জাভা দ্বারা অবরুদ্ধ?

আপনাকে জাভা ডিজাইনারদের জিজ্ঞাসা করতে হবে। সীমাবদ্ধতার জন্য কিছু সূক্ষ্ম ব্যাকরণগত কারণ থাকতে পারে। নোট করুন যে কয়েকটি অ্যারে তৈরি / ইনিশিয়েশন কনস্ট্রাক্টস জাভা ১.০ এ ছিল না, এবং (আইআইআরসি) জাভা ১.১ এ যুক্ত হয়েছিল।

তবে "কেন" অবিচ্ছেদ্য ... নিষেধাজ্ঞাগুলি রয়েছে এবং আপনাকে এটির সাথে বাঁচতে হবে।

আমি জানি যে এটির চারপাশে কীভাবে কাজ করা যায় তবে সময়ে সময়ে এটি সহজ হবে।

আপনি এটি লিখতে পারেন:

AClass[] array;
...
array = new AClass[]{object1, object2};

9
ডাব্লু / ও নতুন ঘোষণায় স্টেটমেন্ট ব্লক এবং অ্যারে ইনিশিয়ালাইজারের মধ্যে কোনও পার্থক্য থাকবে না (জাভাস্ক্রিপ্টে যেমন বিভ্রান্তিমূলক হতে পারে}
বেটসেস)

10
এটা তোলে হবে বিভ্রান্তিকর ... এবং বিশ্লেষণ করতে কঠিন হতে। {o1()}একটি বৈধ এক্সপ্রেশন এবং {o1();}একটি বৈধ বিবৃতি ব্লক ছিল কিনা বিবেচনা করুন । পার্সারকে '}' বা ';' এ যেতে হবে; এটি দুটি ক্ষেত্রে পার্থক্য করতে পারে আগে। ব্যাকরণগত বিষয়টি মোটেই সূক্ষ্ম নয় !!
স্টিফেন সি

19

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

আপনি যদি দুটি অ্যারের দৈর্ঘ্য দিয়ে আপনার অ্যারে শুরু করেন এবং পরে এটির পরিবর্তে আপনাকে তিনটি দৈর্ঘ্যের প্রয়োজন হয় তবে আপনার যা পেয়েছে তা ফেলে দিতে হবে এবং একটি সম্পূর্ণ নতুন অ্যারে তৈরি করতে হবে। অতএব 'নতুন' কীওয়ার্ড।

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

আমি এটি বলব (এবং যদি কেউ আরও ভাল জানেন তবে দয়া করে আমাকে সংশোধন করুন) প্রথম উদাহরণটি

AClass[] array = {object1, object2}

আসলে মানে

AClass[] array = new AClass[]{object1, object2};

তবে জাভা ডিজাইনাররা যা করেছিলেন তা হ'ল আপনি যদি ঘোষণার সময় অ্যারে তৈরি করেন তবে এটি লেখার দ্রুততর উপায় তৈরি করা।

প্রস্তাবিত কাজের ক্ষেত্রগুলি ভাল are রানটাইমে সময় বা মেমরির ব্যবহার সমালোচনা হলে অ্যারে ব্যবহার করুন। যদি এটি সমালোচনা না করে এবং আপনি এমন কোড চান যা বোঝা এবং এর সাথে কাজ করা সহজ হয় তবে অ্যারেলিস্ট ব্যবহার করুন।


2
এটি একটি শর্টকাট যা আপনি বলেছিলেন, ওরাকেলের উদ্ধৃতি দিয়ে: "বিকল্পভাবে, আপনি একটি অ্যারে তৈরি করতে এবং আরম্ভ করতে শর্টকাট বাক্য গঠন ব্যবহার করতে পারেন" । কারণ হতে পারে যে কোনও বিন্দুতে নতুন ব্যবহার করে মেমরিতে কিছু স্থান দিতে হবে । শর্টকাটে নতুন অন্তর্ভুক্ত তবে শর্টকাটটি কেবলমাত্র ঘোষণায় বৈধ। অন্য কোথাও কোনও শর্টকাট অনুমোদিত নয় এবং নতুনটি বাধ্যতামূলক।
মিনিট

3
আমি দুঃখিত, তবে "কেন" প্রশ্নের জবাব দেওয়ার জন্য আপনার চেষ্টাটি জল ধরে না। সংকলকটি আর {ও এর মধ্যে প্রকাশের পরিমাণগুলি গণনা করে অ্যারে কত বড় হওয়া দরকার তা ঠিকভাবে কাজ করতে সক্ষম হবে }... যেমন এটি প্রাথমিক অনুমতি ফর্মগুলির জন্য যেমন হয়।
স্টিফেন সি

8

আমি কেন উত্তর দিতে পারি না।

তবে আপনি যদি কিছু গতিশীল চান তবে কেন আপনি সংগ্রহ অ্যারেলিস্টটিকে বিবেচনা করবেন না।

অ্যারেলিস্ট যে কোনও অবজেক্ট টাইপের হতে পারে।

এবং যদি কোনও বাধ্যবাধকতা হিসাবে আপনি এটিটিকে অ্যারে হিসাবে চান তবে আপনি এটিতে টো অ্যারে () পদ্ধতি ব্যবহার করতে পারেন।

উদাহরণ স্বরূপ:

            ArrayList<String> al = new ArrayList<String>();
            al.add("one");
            al.add("two");
            String[] strArray = (String[]) al.toArray(new String[0]);

আমি আশা করি এটি আপনাকে সাহায্য করতে পারে।


2
স্ট্রিং [] এ অ্যারের রিটার্ন টাইপ দেওয়ার দরকার নেই। চুক্তি অনুসারে প্রত্যাশিত অ্যারে নির্দিষ্ট ধরণের অ্যারের মতোই। docs.oracle.com/javase/6/docs/api/java/util/…
অঙ্কুর আগরওয়াল

4

আপনার মধ্যে যারা এই রাক্ষসী new AClass[] { ... }সিনট্যাক্স পছন্দ করেন না তাদের জন্য এখানে কিছু চিনি দেওয়া হয়েছে:

public AClass[] c(AClass... arr) { return arr; }

আপনার পছন্দ মতো এই ছোট্ট ফাংশনটি ব্যবহার করুন:

AClass[] array;
...
array = c(object1, object2);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.