জাভা 8 স্ট্রিম উদাহরণগুলি কি সর্বদা কাছাকাছি থাকা উচিত () 'ডি?


12

বলিলেন Javadoc :

স্ট্রিমগুলির একটি বেসস্ট্রিম.ক্লোজ () পদ্ধতি রয়েছে এবং অটোক্লোজেবল বাস্তবায়ন করা হয় তবে প্রায় সমস্ত স্ট্রিম দৃষ্টান্ত ব্যবহারের পরে আসলে বন্ধ করার প্রয়োজন হয় না। সাধারণত, কেবলমাত্র যার স্ট্রিমগুলির আইও চ্যানেল (যেমন ফাইল.লাইনস দ্বারা পাঠানো (পথ, চরসেট)) বন্ধ করতে হবে। বেশিরভাগ স্ট্রিমগুলি সংগ্রহ, অ্যারে বা উত্পন্ন ফাংশন দ্বারা ব্যাক হয়, যার জন্য কোনও বিশেষ সংস্থান ব্যবস্থাপনার প্রয়োজন হয় না। (যদি কোনও স্ট্রিমের সমাপ্তির প্রয়োজন হয়, তবে এটি সম্পদ-সহ-বিবৃতিতে সংস্থান হিসাবে ঘোষণা করা যেতে পারে))

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

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

স্ট্রিম বন্ধ করার চারপাশে আপনার সেরা অনুশীলনগুলি কী কী? আমি জেডিকে কিছু লোকের কাছ থেকে উত্তরটির জন্য অনলাইনে সন্ধান করেছি যারা সাধারণত অনুরূপ সম্প্রদায় প্রশ্নগুলিতে সক্রিয়, তবে প্রাসঙ্গিক কোনও কিছু পাইনি।


কোনও জাভা বিকাশকারী নয়, তবে আমি এই নিয়মগুলি ব্যবহার করব: - কোনও স্ট্রিমটি যদি তর্ক হিসাবে প্রেরণ করা হয়, ডকুমেন্টটি যে কলকারীকে অবশ্যই প্রয়োজনের প্রবাহটি বন্ধ করতে হবে; - যদি কোনও ফাংশন থেকে আপনার কাছে স্ট্রিমটি ফিরিয়ে দেওয়া হয় তবে ধরে নিন যে আপনার এটি বন্ধ করা দরকার।
বার্ট ভ্যান ইনজেন শেহেনো

উত্তর:


6

যেমনটি আপনি বলেছিলেন, জাভাতে আপনাকে সঠিকভাবে জানা উচিত যে কোন সংস্থানটি মুক্ত করার জন্য কে দায়বদ্ধ, তাই আপনি যথাযথ চেষ্টা-ধরা-নির্মাণ, সংস্থান-সহ চেষ্টা করতে পারেন বা কোনওভাবে এই কাজটি অর্পণ করতে পারেন।

আপনার পক্ষে পরিষ্কার করার জন্য আপনি জিসির উপর নির্ভর করতে পারেন কেবলমাত্র 100% খাঁটি স্মৃতি।
যদি অন্য কোনও সংস্থান মিশ্রিত হতে পারে তবে আপনি কেবল যুক্তিসঙ্গতভাবে করতে পারেন কেবল এটি নিরাপদভাবে খেলানো।


সুতরাং মূলত closeএকমাত্র নিরাপদ বিকল্প? আমি অনুমান করি যে প্রশ্নটি কীভাবে কোডটিকে অতিরিক্ত কুশ্রী দেখাবেন না প্রতিবার কোনও স্ট্রিম ব্যবহার করা সহজ হবে।
RuslanD

1
হ্যাঁ, যদি সেখানে পারে অনুমান অ মেমরি রিসোর্স হতে, কি শুধুমাত্র নিরাপদ জিনিস আছে হয় । এর আশেপাশে কোনও উপায় নেই, যদিও জাভা GC'd অ সংস্থানগুলির জন্য খুব অসুস্থ।
Deduplicator

সুতরাং যদি এটি দুটি সংগ্রহের (খাঁটি স্মৃতি) মধ্যে কেবল একটি স্রোত হয় তবে এটি বন্ধ করা প্রয়োজনীয় নয়?
অমলগোভিনাস

@ আমালগোভিনাস সঠিক
ব্র্যাড

5

"সেরা অনুশীলনগুলি" যতদূর যায়, আমি মনে করি যে "রিসোর্স স্ট্রিমগুলি" ফেরানোর পদ্ধতিগুলির জন্য নামকরণের কনভেনশন ব্যবহার করা ভাল ধারণা।

যদি কোনও স্ট্রিমটি close()এডি করতে হয় তবে কারখানার পদ্ধতিতে কল করুন open()বা openStream()stream()এসডিকে প্রতিষ্ঠিত কনভেনশন অনুসরণ করে কল পদ্ধতিগুলি যা অল্পকালীন স্ট্রিমগুলি তৈরি করে। ক্লায়েন্টকে তাদের অবশ্যই close()তা সতর্ক করতে সর্বদা পদ্ধতিতে জাভাদোক রাখুন।

public interface StreamingServer<RECORD> {
    /** 
     * Return a memory-efficient record stream from {@code source}.
     * Clients <em>must</em> call {@link Stream#close} to dispose the
     * stream.
     */
    Stream<RECORD> openStream(URI source) throws IOException;
}

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

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

@RequiresClose
Stream<RECORD> openStream(URI source) throws IOException { ... }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.