জাভা ব্যবহারের বিবৃতি আছে?


107

হাইপারনেটে একটি সেশন খোলার সময় জাভাতে কি ব্যবহারের বিবৃতি রয়েছে?

সি # তে এটি এমন কিছু:

using (var session = new Session())
{


}

সুতরাং অবজেক্টটি সুযোগের বাইরে চলে যায় এবং স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।


4
"একটি অবজেক্টের জন্য একটি সুযোগ নির্ধারণ করার অনুমতি দেওয়া" এটি কি তা usingকরে না। ব্যাপ্তি আজীবন নয় (এবং usingDispose
কোনওভাবেই আজীবনের

4
@ জোরেন আপনার মন্তব্যটি আপ-ভোট হচ্ছে তবে আমি আরও কিছু তথ্য দিয়ে যেতে পারি। আপনিই সেই "আজীবন" ধারণাটি প্রবর্তন করছেন তবে আপনি বলবেন এটি "জীবনকাল" নয়। স্কপ হ'ল এমএসডিএন গ্রন্থাগার থেকে সংজ্ঞাটিতে ব্যবহৃত শব্দটি, সম্ভবত আমি এটির অপব্যবহার করেছি। আপনি কিভাবে সংজ্ঞায়িত করবেন using statement
Jla

1
স্কোপ কোডের সেই অঞ্চলটিকে বোঝায় যেখানে আপনি কোনও পুরোপুরি যোগ্য নাম (স্থানীয় ভেরিয়েবল, প্রকার, পদ্ধতির নাম এবং এই জাতীয়) ব্যবহার না করে সনাক্তকারীকে উল্লেখ করতে পারেন। লাইফটাইম এমন সময়কে বোঝায় যেখানে কোনও বস্তু বা পরিবর্তনশীল অ্যাক্সেসযোগ্য। ব্লগস.এমএসডিএন
বি /

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

উত্তর:


124

জাভা 7 চালু করেছে অটোমেটিক রিসোর্স ব্লক ম্যানেজমেন্ট যা জাভা প্ল্যাটফর্মে এই বৈশিষ্ট্যটি নিয়ে আসে। জাভা আগের সংস্করণগুলোতে কিছু প্রতিম ছিল না using

উদাহরণস্বরূপ, আপনি java.lang.AutoCloseableনিম্নলিখিত পদ্ধতিতে যে কোনও পরিবর্তনশীল প্রয়োগ করতে পারেন :

try(ClassImplementingAutoCloseable obj = new ClassImplementingAutoCloseable())
{
    ...
}

java.io.Closeableস্ট্রিম দ্বারা প্রয়োগ করা জাভার ইন্টারফেসটি স্বয়ংক্রিয়ভাবে প্রসারিত হয় AutoCloseable, সুতরাং আপনি ইতিমধ্যে কোনও tryব্লকের স্ট্রিমগুলি একইভাবে সি # usingব্লকে ব্যবহার করতে পারবেন । এটি সি # এর সমান using

সংস্করণ 5.0AutoCloseable হিসাবে , হাইবারনেট সেশনগুলি প্রয়োগ করে এবং এআরএম ব্লকগুলিতে স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যেতে পারে। হাইবারনেট সেশনAutoCloseable এর পূর্ববর্তী সংস্করণগুলিতে প্রয়োগ করা হয়নি । সুতরাং এই বৈশিষ্ট্যটি ব্যবহার করার জন্য আপনাকে হাইবারনেট> = 5.0 এ থাকা দরকার।


1
"ভাগ্যক্রমে" জাভা 7 এখন উপলভ্য থাকায়, এই উত্তরটি আর সত্য নয় (এবং আমি মনে করি যে এআরএম ব্লকগুলি ঠিক তাই usingকরে)।
জোছিম সউর

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

1
৪.৩-তে ইভেন্ট নয় হাইবারনেট অটোক্লোজেবল বাস্তবায়ন করে নাdocs.jboss.org/hibernate/orm/4.3/javadocs/index.html?org/… আমার কি মনে হয় এটির নিজের মোড়কটি লিখতে হবে?
আন্দ্রে রিনিয়া

1
অধিবেশন অটোক্লোজেবল বাস্তবায়ন করতে পারে না কারণ সেশনক্লোজ () কোনও সংযোগ দেয়। আমি মনে করি এটি একটি খারাপ নকশা তবে আমি সন্দেহ করি এটি কখনও পরিবর্তিত হবে।
usr-local-ΕΨΗΕΛΩΝ

@ usr-local-just আমি ঠিক বুঝতে পেরেছিলাম যে তারা হাইবারনেট ব্যবহার করে যে কাউকে জাভা 7 এ স্যুইচ করতে বাধ্য করছে যদি তারা সেই ইন্টারফেসটি প্রয়োগ করে। AutoCloseableজাভা 7 এর আগে উপস্থিত ছিল না?
নীল

31

জাভা 7 করার আগে , সেখানে ছিল কোন জাভা যেমন বৈশিষ্ট্য (জাভা 7 এবং আপ দেখতে আসফ এর উত্তর সংক্রান্ত এআরএম )।

আপনার এটি ম্যানুয়ালি করা দরকার ছিল এবং এটি একটি ব্যথা ছিল :

AwesomeClass hooray = null;
try {
  hooray = new AwesomeClass();
  // Great code
} finally {
  if (hooray!=null) {
    hooray.close();
  }
}

এবং যে শুধু কোড যখন তন্ন তন্ন এর // Great codeকিংবা hooray.close()কোনো ব্যতিক্রম নিক্ষেপ করতে পারেন।

যদি আপনি সত্যিই কেবল একটি ভেরিয়েবলের পরিধি সীমাবদ্ধ করতে চান তবে একটি সাধারণ কোড ব্লক কাজটি করে:

{
  AwesomeClass hooray = new AwesomeClass();
  // Great code
}

তবে এটি সম্ভবত আপনি বোঝাতে চেয়েছিলেন না।


1
আপনার জাভা সমতুল্য কোনও // Great codeব্যতিক্রম হওয়া উচিত নয় ।
চিজো

3
কনস্ট্রাক্টর যখন একটি ব্যতিক্রম ছুঁড়ে মারে তখন আমার মনে হয় আপনার কোডটি নালপয়েন্টারএক্সেপশনটির ফলে যাচ্ছে যা মূল ব্যতিক্রমকে মুখোশ করেছে।
মাইকেল বর্গওয়ার্ট

@ মিশেল: আসলে আমার উদাহরণটি সংকলন করবে না, কারণ horrayসম্ভবত সেই সময়ে আরম্ভ করা হয়নি (এখনই স্থির)।
জোছিম সউর

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

1
আপনি যদি কনস্ট্রাক্টর থেকে কোনও ব্যতিক্রম ধরতে চান তবে আপনার চেষ্টা ব্লকের ভিতরে থাকতে হবে। পুরো জিনিসটিকে অন্য একটি চেষ্টা / ক্যাপচারে আবৃত করা জটিল হবে।
ths

19

জাভা 7 যেহেতু এটা আছে: http://blogs.oracle.com/darcy/entry/project_coin_updated_arm_spec

প্রশ্নের কোডটির বাক্য গঠনটি হ'ল:

try (Session session = new Session())
{
  // do stuff
}

নোট করুন যে Sessionএটি প্রয়োগ করতে হবে AutoClosableবা এর (অনেক) উপ-ইন্টারফেসগুলির মধ্যে একটি।


8

টেকনিক্যালি:

DisposableObject d = null;
try {
    d = new DisposableObject(); 
}
finally {
    if (d != null) {
        d.Dispose();
    }
}

2
এটি করার সর্বোত্তম উপায় নয়। stackoverflow.com/questions/1909662/…
মার্ক বাইয়ার্স

5
এটি মূলত সমতুল্য হবে। এটি সর্বোত্তম উপায় কিনা আমি তা চিন্তা করি না।
কেওসপ্যান্ডিয়ন

2
সত্যিকারের সি # প্রোগ্রামারের মতো লেখা। ;)
নীল




2

আপনি সম্পদ ব্যবস্থাপনায় আগ্রহী হন, তাহলে প্রকল্প Lombok উপলব্ধ করা হয় @Cleanupটীকা। সরাসরি তাদের সাইট থেকে নেওয়া:

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

@Cleanup InputStream in = new FileInputStream("some/file");

ফলস্বরূপ, আপনি যে সুযোগে এসেছেন তার শেষে in.close()বলা হয়। এই কলটি চেষ্টা / শেষ পর্যন্ত নির্মাণের মাধ্যমে চালানোর গ্যারান্টিযুক্ত। এটি কীভাবে কাজ করে তা দেখতে নীচের উদাহরণটি দেখুন।

আপনি যে ধরণের অবজেক্টটি পরিষ্কার করতে চান তার যদি কোনও close() পদ্ধতি না থাকে তবে অন্য কোনও যুক্তিযুক্ত পদ্ধতি না থাকে তবে আপনি এই পদ্ধতির নামটি এভাবে নির্দিষ্ট করতে পারেন:

@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);

ডিফল্টরূপে, ক্লিনআপ পদ্ধতিটি অনুমান করা হয় close()। আর্গুমেন্ট গ্রহণ করে এমন একটি ক্লিনআপ পদ্ধতি মাধ্যমে কল করা যায় না @Cleanup

ভ্যানিলা জাভা

import java.io.*;

public class CleanupExample {
  public static void main(String[] args) throws IOException {
    InputStream in = new FileInputStream(args[0]);
    try {
      OutputStream out = new FileOutputStream(args[1]);
      try {
        byte[] b = new byte[10000];
        while (true) {
          int r = in.read(b);
          if (r == -1) break;
          out.write(b, 0, r);
        }
      } finally {
        out.close();
      }
    } finally {
      in.close();
    }
  }
}

লম্বোকের সাথে

import lombok.Cleanup;
import java.io.*;

public class CleanupExample {
  public static void main(String[] args) throws IOException {
    @Cleanup InputStream in = new FileInputStream(args[0]);
    @Cleanup OutputStream out = new FileOutputStream(args[1]);
    byte[] b = new byte[10000];
    while (true) {
      int r = in.read(b);
      if (r == -1) break;
      out.write(b, 0, r);
    }
  }
}


1

দয়া করে জাভা কীওয়ার্ডগুলির এই তালিকাটি দেখুন ।

  1. usingশব্দ দুর্ভাগ্যবশত তালিকার অংশ নয়।
  2. এবং usingজাভাতে এখনকার মতো অন্য কোনও কীওয়ার্ডের মাধ্যমে সি # কীওয়ার্ডের সমতুল্যতা নেই ।

যেমন "using"আচরণ অনুকরণ করতে , আপনাকে একটি try...catch...finallyব্লক ব্যবহার করতে হবে , যেখানে আপনি অভ্যন্তরীণ সংস্থানগুলি নিষ্পত্তি করবেন finally


6
মূলশব্দ নয় এমন ঘটনাটি usingকোনও জিনিস বোঝায় না। @ বালাসসি উল্লিখিত হিসাবে একই বৈশিষ্ট্যটি অন্য কীওয়ার্ডের সাথে প্রয়োগ করা যেতে পারে (এবং হবে!)
জোচিম সউর

1
আমি রাজী! তবে আপাতত, এর অস্তিত্ব নেই, তাই না? এটিই ওপি জিজ্ঞাসা করেছিল, এখনই যদি তেমন কিছু থাকে। এটি জেনে রাখা ভাল যে এটি ভবিষ্যতে প্রকাশে প্রকাশিত হবে, তবে এটি এখন, কোনওভাবে বা অন্য কোনওভাবে কোনও পরিবর্তন করে না। যাইহোক, @ বালাসকির দেওয়া তথ্য যদিও দুর্দান্ত! =)
মারকুইলারের

2
আমি এটির সাথে একমত, তবে আপনার পোস্ট বলে মনে হচ্ছে যে usingজাভা কীওয়ার্ডের তালিকায় নেই এমন অর্থ এই বৈশিষ্ট্যটি জাভা ভাষায় উপস্থিত নেই present এবং এটা সত্য নয়।
জোচিম সউর

যদি আমার পোস্টটি এটি বলে মনে হয় তবে আমি আমার উদ্দেশ্যটি প্রতিফলিত করতে সম্পাদনা করব।
উইল মারকুইলারের

আমি আমার উত্তরটি সম্পাদন করে উল্লেখ করেছিলাম যে কোনও usingকীওয়ার্ড ছিল না , এবং এখনকার মতো কোনও সমতাও নেই। ধন্যবাদ @ জোছিম সৌর! =)
মারকুইলার


0

কোনও ভেরিয়েবলের সীমাবদ্ধতা সম্পর্কিত প্রশ্নের উত্তর দেওয়ার জন্য, ভেরিয়েবলগুলি স্বয়ংক্রিয়ভাবে বন্ধ / নিষ্পত্তি করার বিষয়ে কথা বলার পরিবর্তে।

জাভাতে আপনি কোঁকড়ানো বন্ধনী ব্যবহার করে বদ্ধ, বেনামি স্কোপগুলি সংজ্ঞায়িত করতে পারেন। এটা অত্যন্ত সহজ।

{
   AwesomeClass hooray = new AwesomeClass()
   // Great code
}

পরিবর্তনশীল কেবল hoorayএই সুযোগে উপলব্ধ, এবং এটির বাইরে নয়।

আপনার যদি কেবলমাত্র অস্থায়ী ভেরিয়েবলগুলি পুনরাবৃত্তি করে থাকে তবে এটি কার্যকর হতে পারে।

উদাহরণস্বরূপ, প্রতিটি সূচকযুক্ত। শুধু itemপরিবর্তনশীল লুপ জন্য ওভার বন্ধ করা হয় (অর্থাত, এটা ভিতরে কেবল প্রাপ্তিসাধ্য), indexপরিবর্তনশীল বেনামী সুযোগ উপর বন্ধ করা হয়।

// first loop
{
    Integer index = -1;
    for (Object item : things) {index += 1;
        // ... item, index
    }
}

// second loop
{
    Integer index = -1;
    for (Object item : stuff) {index += 1;
        // ... item, index
    }
}

আমি আপনার মাঝে মাঝে ভ্যারিয়েবল স্কোপ সরবরাহ করার জন্য লুপ না রাখলে এটি ব্যবহার করি তবে আপনি জেনেরিক ভেরিয়েবলের নাম ব্যবহার করতে চান।

{
    User user = new User();
    user.setId(0);
    user.setName("Andy Green");
    user.setEmail("andygreen@gmail.com");
    users.add(user);
}

{
    User user = new User();
    user.setId(1);
    user.setName("Rachel Blue");
    user.setEmail("rachelblue@gmail.com");
    users.add(user);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.