জাভা লুকানো বৈশিষ্ট্য


295

সি # এর লুকানো বৈশিষ্ট্যগুলি পড়ার পরে আমি ভাবলাম, জাভা সম্পর্কিত কিছু লুকানো বৈশিষ্ট্য কী?


17
মনে রাখবেন যে এই লুকানো বৈশিষ্ট্যগুলি ব্যবহার করা সর্বদা দুর্দান্ত ধারণা নয়; প্রায়শই তারা আপনার কোডটি পড়তে অন্যকে অবাক করে এবং বিভ্রান্ত করে।
কেভিন বোউরিলিয়ন

1
আপনার (/ কেউ) সম্ভবত প্রশ্ন # ব # তে সি # প্রশ্নের মতো উত্তরগুলি খুব সুন্দরভাবে যোগ করতে হবে।
রিপার 234

উত্তর:


432

ডাবল ব্রেস সূচনা আমাকে কয়েক মাস আগে অবাক করে দিয়েছিল যখন আমি এটি প্রথম আবিষ্কার করেছি, এর আগে কখনও শুনিনি।

থ্রেডলোকালগুলি সাধারণত প্রতি-থ্রেডের স্থিতি সংরক্ষণের উপায় হিসাবে এত বেশি পরিচিত নয়।

যেহেতু JDK 1.5 জাভাতে কেবলমাত্র লক ছাড়াই অত্যন্ত কার্যকর এবং শক্তিশালী একযোগের সরঞ্জাম রয়েছে, তাই তারা java.util.concurrent এ বাস করে এবং একটি বিশেষ আকর্ষণীয় উদাহরণ হল java.util.concurrent.atomic সাবপ্যাকেজ যা থ্রেড-নিরাপদ আদিম রয়েছে যা তুলনা কার্যকর করে -আর-সোয়াপ অপারেশন এবং এই ক্রিয়াকলাপগুলির আসল দেশীয় হার্ডওয়্যার-সমর্থিত সংস্করণগুলিতে মানচিত্র করতে পারে।


40
ডাবল-ব্রেস সূচনা ... অদ্ভুত ... যদিও আমি সেই বিশেষ আইডিয়োমটি ব্যাপকভাবে গ্রহণ করার বিষয়ে সতর্ক থাকব, কারণ এটি বস্তুটির একটি বেনামহীন সাবক্লাস তৈরি করে, যা বিভ্রান্তিকর সমান / হ্যাশকোড সমস্যার কারণ হতে পারে। java.util.concurrent আসলেই দুর্দান্ত প্যাকেজ।
এমবি

6
আমি জাভা শিখিয়েছি , এবং এই সিনট্যাক্সটি নিয়ে আমি এই প্রথম এসেছি ... যা আপনাকে দেখায় যে কখনও শেখা বন্ধ করা হয় না = 8-)
যুবাল

49
মনে রাখবেন যে আপনি যদি এই "ডাবল ব্রেস" আইডিয়ম দিয়ে শুরু করা কোনও সংগ্রহের রেফারেন্স ধরে রাখেন (বা আমরা যদি এটির আসল নাম দিয়ে আখ্যায়িত করি - প্রারম্ভিক ব্লক সহ বেনামে বর্গ), আপনি স্পষ্টভাবে বাইরের অবজেক্টের জন্য একটি রেফারেন্স রাখেন যা দুষ্টু স্মৃতি তৈরি করতে পারে তথ্য ফাঁসের। আমি এটিকে পুরোপুরি এড়িয়ে যাওয়ার পরামর্শ দিই।
ddimitrov

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

11
প্রায়, এটি আসলে একটি স্ট্যাটিক ব্লক নয় তবে একটি "ইনিশিয়াল ব্লক" যা এটি ভিন্ন সময়ে কার্যকর করা হওয়ার পরে আলাদা (আরও লিঙ্কটির উত্তরে আমি যে লিঙ্কটি দিয়েছি তা দেখুন)
বোরিস টেরজিক

279

টাইপ প্যারামিটার ভেরিয়েন্সে যৌথ ইউনিয়ন:

public class Baz<T extends Foo & Bar> {}

উদাহরণস্বরূপ, আপনি যদি তুলনামূলক এবং সংগ্রহ উভয়ই প্যারামিটার নিতে চান:

public static <A, B extends Collection<A> & Comparable<B>>
boolean foo(B b1, B b2, A a) {
   return (b1.compareTo(b2) == 0) || b1.contains(a) || b2.contains(a);
}

প্রদত্ত দুটি সংগ্রহ সমান হয় বা যদি তাদের মধ্যে একটিতে প্রদত্ত উপাদান থাকে, অন্যথায় মিথ্যা হয় তবে এই স্বীকৃত পদ্ধতিটি সত্যটি প্রত্যাবর্তন করবে। লক্ষ্য করার বিষয়টি হ'ল আপনি আর্গুমেন্ট বি 1 এবং বি 2 তে তুলনামূলক এবং সংগ্রহ উভয়ের পদ্ধতির আবেদন করতে পারেন।


এর জন্য আমার প্রিয় ব্যবহার হ'ল যখন আপনার একটি অ্যাপেনডেবল অক্ষর গ্রহণযোগ্য পদ্ধতি দরকার।
নীল কফফি

5
সেখানে & এর পরিবর্তে সেখানে "ওআর" পাওয়া কি সম্ভব?
মেইনস্ট্রিংগার্স

9
@ গ্রাস্পার: না, বা (সংঘবদ্ধ ইউনিয়ন) সেই প্রসঙ্গে সরবরাহ করা হয়নি। তবে আপনি এর পরিবর্তে হয় <<, বি> এর মতো একটি বিচ্ছিন্ন ইউনিয়ন ডেটাটাইপ ব্যবহার করতে পারেন। এই টাইপটি একটি জোড় <<, বি> টাইপের দ্বৈত। এই জাতীয় ডেটাটাইপের উদাহরণের জন্য ফাংশনাল জাভা গ্রন্থাগার বা স্কালা কোর লাইব্রেরি দেখুন।
অ্যাপোক্যালিস্প

5
আপনার বলা উচিত যে আপনার অবশ্যই একটি শ্রেণি এবং একাধিক ইন্টারফেস প্রসারিত করতে হবে -> সার্বজনীন শ্রেণীর বাজ <টি ক্লজ এবং ইন্টারফেস 1 এবং ইন্টারফেসআই প্রসারিত করেছে ... এবং ক্লাস বাজ <টি ক্লজ 1 এবং ক্লাজি>
বাড়িয়েছে না

220

আমি অন্য দিন উদাহরণস্বরূপ দ্বারা অবাক হয়েছিল। আমি কিছু কোড-ভাঁজ পদ্ধতি মুছে ফেলছিলাম এবং একাধিক উদাহরণ সূচনা তৈরির কাজ শেষ করেছি:

public class App {
    public App(String name) { System.out.println(name + "'s constructor called"); }

    static { System.out.println("static initializer called"); }

    { System.out.println("instance initializer called"); }

    static { System.out.println("static initializer2 called"); }

    { System.out.println("instance initializer2 called"); }

    public static void main( String[] args ) {
        new App("one");
        new App("two");
  }
}

mainপদ্ধতিটি কার্যকর করা প্রদর্শিত হবে:

static initializer called
static initializer2 called
instance initializer called
instance initializer2 called
one's constructor called
instance initializer called
instance initializer2 called
two's constructor called

আমার মনে হয় আপনার যদি একাধিক কনস্ট্রাক্টর এবং সাধারণ কোডের প্রয়োজন হয় তবে এগুলি কার্যকর হবে

তারা আপনার ক্লাস শুরু করার জন্য সিনট্যাকটিক চিনি সরবরাহ করে:

List<Integer> numbers = new ArrayList<Integer>(){{ add(1); add(2); }};

Map<String,String> codes = new HashMap<String,String>(){{ 
  put("1","one"); 
  put("2","two");
}};

38
একটি সুস্পষ্ট পদ্ধতি যা কল করা প্রয়োজন তার ওপরে এটির সুবিধাটি হ'ল যদি কেউ পরে কোনও নির্মাণকারী যুক্ত করে তবে তাদের init () নাম্বার কল করতে হবে না; এটি স্বয়ংক্রিয়ভাবে সম্পন্ন হবে। এটি ভবিষ্যতের প্রোগ্রামারদের ত্রুটি প্রতিরোধ করতে পারে।
মিঃ শাইনি এবং নিউ 宇 宇

40
এছাড়াও, কোনও init () পদ্ধতির বিপরীতে, এটি চূড়ান্ত ক্ষেত্রগুলি সূচনা করতে পারে।
ড্যারন

2
আপনি যদি ক্লাসটি প্রসারিত করেন এবং বিভিন্ন শিশুদের ইনস্ট্যান্ট করেন তবে? এটি কি এখনও একই পদ্ধতিতে আচরণ করবে?
কেজ্জার

12
লোকেরা প্রায়শই শংসাপত্রগুলি অক্ষম করে (যেমন: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ২২১১০০ / ২২১১২##281127 ) এবং বিশেষত তাদের প্রযুক্তিগত যোগ্যতা নিয়ে প্রশ্ন তোলে । তবে যদি এখানে আরও প্রোগ্রামাররা তাদের এসসিজেপি-র জন্য পড়াশোনা করে থাকেন, তবে এতো লোকের দ্বারা এটি কোনও "লুকানো বৈশিষ্ট্য" হিসাবে বিবেচিত হবে না। ;-)
জোনিক

12
আমি এমনকি "24 ঘন্টার মধ্যে জাভা" বইয়ের এই "সুস্পষ্ট বৈশিষ্ট্যটি" রেখেছি। আরও ছেলেরা পড়ুন:) (
üzgür

201

জেডিকে ১.6.০7++ এ ভিজুয়ালভিএম (বিন / jvisualvm.exe) নামে একটি অ্যাপ্লিকেশন রয়েছে যা অনেকগুলি সরঞ্জামের শীর্ষে একটি দুর্দান্ত জিইউআই। এটি জে কনসোলের চেয়ে আরও বিস্তৃত বলে মনে হচ্ছে।


এবং এটিতে একটি প্লাগইন রয়েছে (এটি একটি নেটবিয়ান আইটেমি) যা এটি জকনসোল প্লাগইনগুলি ব্যবহার করতে দেয়। অনেক ভালো.
থরবজর্ন রাভন অ্যান্ডারসন

টুকরো টুকরো রুটি করার পর থেকে ভিজ্যুয়ালভিএম হ'ল সেরা জিনিস! খুব খারাপ এটি জেডি কে 1.5
স্যান্ডোস

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

জেডিকে ১.6.০-২২ এবং পরবর্তীকালের ভিজ্যুয়াল ভিএম এর আরও সাম্প্রতিক সংস্করণগুলি অনেক উন্নত হয়েছে। আমি জেডিকে ১..7 এর আরও উন্নত সংস্করণ রেখেছি bet
jangofan


156

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

// code goes here

getmeout:{
    for (int i = 0; i < N; ++i) {
        for (int j = i; j < N; ++j) {
            for (int k = j; k < N; ++k) {
                //do something here
                break getmeout;
            }
        }
    }
}

gotoজাভাতে কে কেবল একটি কীওয়ার্ড বলেছিল ? :)


2
ঠিক আছে, আমি বরং এটি বেশ কয়েকটি উপায়ে করার বিকল্প পছন্দ করতে চাই। উদাহরণস্বরূপ, আমি লোকদের দেখেছি System.exit (1) ব্যবহার করে; সার্ভলেট এবং ইজেবি কোডে, তবে এর অর্থ এই নয় যে আমাদের সিস্টেম.এক্সিট () অপসারণ করা উচিত; জেডিকে থেকে, তাই না?
জর্জি বলিবা

31
কিছু পরিস্থিতিতে, নেস্টেড লুপ কনস্ট্রাক্টের মধ্যে, বাইরের লুপের পরবর্তী পুনরাবৃত্তিতে চালিয়ে যাওয়া কার্যকর হতে পারে। এটি এই বৈশিষ্ট্যটির যুক্তিসঙ্গত ব্যবহার হবে।
আলাসডায়রগ

75
বিশেষত অনেক প্রোগ্রামারদের কাছে অজানা (এবং সম্ভবত ঠিক পাশাপাশি) এটি হ'ল যে আপনি আসলে কোনও পুরানো ব্লকটি লেবেল করতে এবং ভেঙে ফেলতে পারেন। এটি একটি লুপ হতে হবে না - আপনি কেবল কিছু নির্বিচার ব্লক সংজ্ঞায়িত করতে পারেন, এটি একটি লেবেল দিতে পারেন এবং এর সাথে বিরতি ব্যবহার করতে পারেন।
নীল কফফি

27
এটি মোটেই গোটো নয়, এটি কেবল পূর্ববর্তী পুনরাবৃত্তিতে ফিরে আসতে পারে (যেমন: আপনি এগিয়ে যেতে পারবেন না)। এটি একই প্রক্রিয়া যা ঘটে যখন কোনও পুনরাবৃত্তি মিথ্যা ফেরত দেয়। জাভা বলা গোটো এমন কোনও ভাষা বলার মতো যাঁর সংকলক জেএমপি নির্দেশনা উত্পন্ন করে তার একটি গেটো স্টেটমেন্ট থাকে।
জোম্বস

4
সুতরাং আপনি সমস্যার সমাধান এবং ডিজাইনের মাধ্যমে চিন্তা করার প্রবণতার চেয়ে জাভা ট্রিভিয়ার উপর ভিত্তি করে সাক্ষাত্কার দিন। আমি নিশ্চিত করব যে আমি কখনই আপনার সংস্থার সাথে সাক্ষাত্কার করব না। :)
জাভিদ জামে

144

কোভেরিয়েন্ট রিটার্নের ধরণগুলি সম্পর্কে কীভাবেJDK 1.5 এর ? এটি বেশ খারাপভাবে প্রচার করা হয়েছে, কারণ এটি একটি আনসেক্সি সংযোজন, তবে আমি এটি যেমন বুঝতে পেরেছি, জেনারিকদের কাজ করা একেবারে প্রয়োজনীয় necessary

মূলত, সংকলকটি এখন একটি সাবক্লাসকে মূল পদ্ধতির রিটার্ন টাইপের একটি সাবক্লাস হতে একটি ওভাররাইড পদ্ধতির রিটার্ন টাইপকে সংকীর্ণ করার অনুমতি দেয়। সুতরাং এটি অনুমোদিত:

class Souper {
    Collection<String> values() {
        ...
    }
}

class ThreadSafeSortedSub extends Souper {
    @Override
    ConcurrentSkipListSet<String> values() {
        ...
    }
}

আপনি উপশ্রেণী এর কল করতে পারেন valuesপদ্ধতি এবং একটি সাজানো থ্রেড নিরাপদ প্রাপ্ত Setএর Stringগুলি নিক্ষেপ করেও করতে ConcurrentSkipListSet


আপনি একটি উদাহরণ ব্যবহার প্রদান করতে পারেন?
আল্লায় লালনোদে

24
আমি এই অনেক ব্যবহার। ক্লোন () একটি দুর্দান্ত উদাহরণ। এটি অবজেক্টটি প্রত্যাবর্তনের কথা, যার অর্থ আপনাকে বলতে হবে উদাঃ (তালিকা) list.clone ()। তবে আপনি যদি তালিকা ক্লোন () {...} হিসাবে ঘোষণা করেন তবে কাস্ট অপ্রয়োজনীয়।
জেসন কোহেন

142

শেষ অবধি নিয়ন্ত্রণের স্থানান্তর কোনও ব্যতিক্রম ছুঁড়ে দেয়। নিম্নলিখিত কোডটি রানটাইমেক্সেপশন নিক্ষেপ করে না - এটি হারিয়ে যায়।

public static void doSomething() {
    try {
      //Normally you would have code that doesn't explicitly appear 
      //to throw exceptions so it would be harder to see the problem.
      throw new RuntimeException();
    } finally {
      return;
    }
  }

Http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html থেকে


7
এটি কদর্য, তবে এটি অবশেষে কীভাবে কাজ করে তার একটি যৌক্তিক পরিণতিও এক ধরণের। চেষ্টা / ধরা / অবশেষে প্রবাহ নিয়ন্ত্রণ যা করতে চায় তা করে তবে কেবল নির্দিষ্ট সীমাবদ্ধতার মধ্যে। একইভাবে, আপনাকে ক্যাচ / অবশেষে ব্লকের ভিতরে কোনও ব্যতিক্রম না ঘটানোর বিষয়ে সতর্কতা অবলম্বন করতে হবে, অথবা আপনি মূল ব্যতিক্রমটিও ফেলে দেবেন। এবং যদি আপনি চেষ্টা ব্লকের ভিতরে একটি System.exit () করেন তবে শেষ অবধি ব্লক করা হবে না। আপনি যদি স্বাভাবিক প্রবাহ ভঙ্গ করেন তবে আপনি স্বাভাবিক প্রবাহটি ভঙ্গ করেন ...
নীল কফফি

অবশেষে ব্যবহার করবেন না {প্রত্যাবর্তন; } তবে শেষ অবধি return কোনও রিটার্ন ছাড়াই কোড} এটি যৌক্তিক, অবশেষে ব্যতিক্রম ঘটলে মৃত্যুদন্ড কার্যকর করার উদ্দেশ্যেও, ব্যতিক্রম হ্যান্ডলার হিসাবে প্রত্যাবর্তনের একমাত্র সম্ভাব্য অর্থ ব্যতিক্রমটিকে উপেক্ষা করা এবং - প্রকৃতপক্ষে - প্রত্যাবর্তন অবশ্যই হওয়া উচিত।
এক্সেরেনন

21
এটি কোনও লুকানো বৈশিষ্ট্যের চেয়ে আরও অনেক বেশি "গোটচা" বলে মনে হয়, যদিও এটি উপায় হিসাবে এটি ব্যবহার করা যেতে পারে তবে এই পদ্ধতিটি ব্যবহার করা ভাল ধারণা হবে না।
davenpcj

আপনি যদি এটি করেন তবে গ্রহন একটি সতর্কতা প্রকাশ করে। আমিগ্রহণের সাথে আছি। আপনি যদি ব্যতিক্রম ধরতে চান ... তবে একটি ব্যতিক্রম ধরুন।
হেলিওস

পদ্ধতির মাঝামাঝি থেকে ফিরে আসা ময়লা কোডের জন্য এটিই আপনি প্রদান করেন। তবে এখনও একটি দুর্দান্ত উদাহরণ।
রোস্টিস্লাভ ম্যাটল

141

কাউকে উদাহরণস্বরূপ এমনভাবে প্রয়োগ করা হচ্ছে বলে উল্লেখ করেনি যে নাল পরীক্ষা করার প্রয়োজন নেই।

পরিবর্তে:

if( null != aObject && aObject instanceof String )
{
    ...
}

শুধু ব্যবহার করুন:

if( aObject instanceof String )
{
    ...
}

9
এটি এত লজ্জাজনক বৈশিষ্ট্য এটি লজ্জাজনক। আমি কোডের প্রথম ব্লকের অনুরূপ প্রচুর কোড দেখেছি।
পিটার ডলবার্গ 16

4
এর কারণ জাভাতে একটি বিশেষ (লুকানো) নাল টাইপ রয়েছে যা আপনি দেখতে পাচ্ছেন না বা রেফারেন্সও দিতে পারবেন না।
নিক হ্রিস্টভ

সবচেয়ে খারাপটি হ'ল সি / সি ++ এ ইনগ freeকরার আগে বা deleteশূন্যতার আগে নাল পরীক্ষা করা । এ জাতীয় মৌলিক ধারণা।
থমাস এডিং

134

এনামগুলিতে অনুমতি দেওয়ার পদ্ধতি এবং নির্মাতারা আমাকে অবাক করে দিয়েছিল। উদাহরণ স্বরূপ:

enum Cats {
  FELIX(2), SHEEBA(3), RUFUS(7);

  private int mAge;
  Cats(int age) {
    mAge = age;
  }
  public int getAge() {
    return mAge;
   }
}

এমনকি আপনার কাছে একটি "ধ্রুবক নির্দিষ্ট শ্রেণীর শরীর" থাকতে পারে যা একটি নির্দিষ্ট এনাম মানকে পদ্ধতিগুলিকে ওভাররাইড করতে দেয়।

আরও ডকুমেন্টেশন এখানে


20
প্রকৃতপক্ষে দুর্দান্ত বৈশিষ্ট্যটি - এনামগুলিকে ওও করে তোলে এবং প্রচুর প্রাথমিক সমস্যার খুব পরিষ্কার উপায়ে সমাধান করে।
বিল কে

5
সিঙ্গেলন হিসাবে এনাম? শুধুমাত্র একটি মান দিয়ে এনাম?
জর্জি বলিবা

6
জর্জি: সিঙ্গলটন হ'ল বস্তুর একটি উদাহরণ, একটি মান সহ কোনও বস্তু নয়।
dshw

20
@ জর্জি: জোশুয়া ব্লচের কার্যকর জাভাতে (দ্বিতীয় সংস্করণ) আইটেমটি 3 দেখুন; "যদিও এই পদ্ধতিটি এখনও বহুলভাবে গ্রহণ করা সম্ভব হয়নি, তবে একটি একক উপাদানগুলির এনাম টাইপটি সিঙ্গলটন বাস্তবায়নের সর্বোত্তম উপায়" "
জোনিক

3
গৌণ নিটপিক: mAgeচূড়ান্ত হওয়া উচিত। এনামগুলিতে চূড়ান্ত না হওয়ার জন্য খুব কমই কারণ রয়েছে।
জোছিম সাউর

121

জেনেরিক পদ্ধতিগুলির জন্য টাইপ প্যারামগুলিকে স্পষ্টভাবে নির্দিষ্ট করে নির্দিষ্ট করা যেতে পারে:

Collections.<String,Integer>emptyMap()

10
আর আল্লাহর কসম এটা কুৎসিত ও বিভ্রান্তিমূলক। এবং সুরক্ষা টাইপ অপ্রাসঙ্গিক।
ক্রিস ব্রডফুট

8
আমি এটা ভালোবাসি. এটি আপনার কোডটিকে কিছুটা আরও স্পষ্ট করে তোলে এবং যেমন দুর্বল লোকদের জন্য এটি আরও পরিষ্কার হয় যা এক বা দু'বছরের মধ্যে এটি বজায় রাখতে হবে।
এক্সেরেনন

6
এটি এমন পরিস্থিতিতে খুব কার্যকর যেখানে আপনি স্থির জেনেরিক পদ্ধতি যেমন ঘোষণা করেছেন public static <T> T foo(T t)। তারপরে আপনি কল করতে পারবেনClass.<Type>foo(t);
ফিনবার

কোনও কারণে এটি স্থিতিশীলভাবে আমদানি করা পদ্ধতিগুলির সাথে কাজ করে না বলে মনে হচ্ছে .. কেন আমি তা ভাবছি।
oksayt

এটি প্রত্যাবর্তনের সাথে টার্নারি আইফএস ব্যবহার করার সময় বিশেষভাবে কার্যকর। উদাহরণস্বরূপ return set1.equals(set2) ? new ArrayList<String>(set1) : Collections.<String>emptyList()। এটি এমন কিছু পদ্ধতির অনুরোধের জন্যও কার্যকর যেখানে একটি সাধারণ সংগ্রহের.অম্পটিম্যাপ () একটি সংকলন ত্রুটি দেয়।
আন্দ্রেস হলসটসন

112

আপনি একটি ইন্টারফেস প্রয়োগ করতে enums ব্যবহার করতে পারেন।

public interface Room {
   public Room north();
   public Room south();
   public Room east();
   public Room west();
}

public enum Rooms implements Room {
   FIRST {
      public Room north() {
         return SECOND;
      }
   },
   SECOND {
      public Room south() {
         return FIRST;
      }
   }

   public Room north() { return null; }
   public Room south() { return null; }
   public Room east() { return null; }
   public Room west() { return null; }
}

সম্পাদনা: বছর পরে ...

আমি এখানে এই বৈশিষ্ট্যটি ব্যবহার করি

public enum AffinityStrategies implements AffinityStrategy {

https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/vanilla/java/affinity/AffinityStrategies.java

একটি ইন্টারফেস ব্যবহার করে, বিকাশকারীরা তাদের নিজস্ব কৌশল নির্ধারণ করতে পারে। একটি enumমাধ্যম ব্যবহার করে আমি এর মধ্যে অন্তর্নির্মিত একটি সংকলন (পাঁচ) এর সংজ্ঞা দিতে পারি।


27
এটা পাগলামি. (+1)
সেফালপড

12
@ আরিয়ান এটি উন্মাদনা নয় এই. IS। JAVAAAAAAHHHH!
slezica

1
WHAAAAAT না, আমি অ্যাড্রিয়ান এর সাথে আছি। এটি জাভা নয়। এটা পাগলামি. আমি এটি ব্যবহার করতে মারা যাচ্ছি।
slezica

104

জাভা 1.5 হিসাবে, জাভা এখন ভেরিয়েবল আরটি ফাংশন লেখার জন্য একটি অনেক ক্লিনার সিনট্যাক্স আছে। সুতরাং, কেবল একটি অ্যারে পাস করার পরিবর্তে, আপনি নিম্নলিখিতটি করতে পারেন

public void foo(String... bars) {
   for (String bar: bars)
      System.out.println(bar);
}

বারগুলি স্বয়ংক্রিয়ভাবে নির্দিষ্ট ধরণের অ্যারেতে রূপান্তরিত হয়। বিশাল জয় নয়, তবুও একটি জয়।


23
এ সম্পর্কে গুরুত্বপূর্ণ বিষয়টি পদ্ধতিটি কল করার সময় আপনি লিখতে পারেন: foo ("প্রথম", "দ্বিতীয়", "তৃতীয়")
স্টিভ আর্মস্ট্রং

9
যাতে পুরাতন হ্যালো দুনিয়াটি আবার লেখা যায়; সর্বজনীন স্ট্যাটিক শূন্য মূল (স্ট্রিং ... আরগস) {System.out.println ("হ্যালো ওয়ার্ল্ড!"); }
কারসেল

@ কারসেল সম্ভবত, তবে মনে হবে এটি যুক্তিগুলি অপ্রাসঙ্গিক: পি
কেলি এলটন

93

আমার প্রিয়: সমস্ত থ্রেড স্ট্যাকের ট্রেসগুলিকে স্ট্যান্ডার্ড আউট করে ফেলুন।

উইন্ডোজ: CTRL- Breakআপনার জাভা সিএমডি / কনসোল উইন্ডোতে

UNIX: kill -3 PID


15
ইউনিক্সে সিটিআরএল- অথবা জেডিকে থেকে জেস্ট্যাক ব্যবহার করুন।
টম হাটিন -

9
ধন্যবাদ, আপনি আমাকে শিখিয়েছেন আমার কীবোর্ডের একটি Breakকী আছে।
অ্যামি বি

2
উইন্ডোগুলিতে, আপনার বর্তমান কনসোল উইন্ডোতে প্রক্রিয়া চলমান থাকলে কেবলমাত্র সিটিআরএল-BREAK কাজ করে। আপনি এর পরিবর্তে JAVA_Home / bin / jstack.exe ব্যবহার করতে পারেন। এটি কেবল উইন্ডোজ প্রসেস আইডি দিয়ে দিন।
জাভিদ জামে

আমি ভেবেছিলাম এটি হত্যাকাণ্ড IG সিগ্বুইয়েট
নিক

@ নিক, হ্যাঁ সিগুয়েটটি সাধারণত # 3 সংকেত হয়।
ক্রিস মাজ্জোলা

89

বেশ কয়েক জন লোক উদাহরণ সূচনা সম্পর্কে পোস্ট করেছেন, এটির জন্য এখানে ভাল ব্যবহার রয়েছে:

Map map = new HashMap() {{
    put("a key", "a value");
    put("another key", "another value");
}};

আপনি কেবল দ্রুত এবং সাধারণ কিছু করতে পারলে মানচিত্রের আরম্ভ করার একটি দ্রুত উপায়।

বা দ্রুত সুইং ফ্রেম প্রোটোটাইপ তৈরি করতে এটি ব্যবহার করে:

JFrame frame = new JFrame();

JPanel panel = new JPanel(); 

panel.add( new JLabel("Hey there"){{ 
    setBackground(Color.black);
    setForeground( Color.white);
}});

panel.add( new JButton("Ok"){{
    addActionListener( new ActionListener(){
        public void actionPerformed( ActionEvent ae ){
            System.out.println("Button pushed");
        }
     });
 }});


 frame.add( panel );

অবশ্যই এটি আপত্তিজনক হতে পারে:

    JFrame frame = new JFrame(){{
         add( new JPanel(){{
               add( new JLabel("Hey there"){{ 
                    setBackground(Color.black);
                    setForeground( Color.white);
                }});

                add( new JButton("Ok"){{
                    addActionListener( new ActionListener(){
                        public void actionPerformed( ActionEvent ae ){
                            System.out.println("Button pushed");
                        }
                     });
                 }});
        }});
    }};

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

15
যদিও এটি ব্যবহার করার একটি পার্শ্ব প্রতিক্রিয়া রয়েছে। নামবিহীন বস্তু তৈরি হয় যা সর্বদা ভাল নাও হতে পারে।
amit

17
যদিও এটি আরও দেখার পরে, আমার বলতে হবে যে আমি এই প্রাকৃতিক বাসা এমনকি এমনকি "আপত্তিজনক" সংস্করণে আকৃষ্ট হই।
বিল কে

4
হ্যাঁ - আমি বেশ 'অপব্যবহার' সংস্করণ পছন্দ করি, আমি মনে করি এটি সত্যিই খুব স্পষ্ট এবং পাঠযোগ্য, তবে সম্ভবত এটি কেবল আমারই।
ব্যারি করা হয়েছে

3
সম্পূর্ণরূপে সম্মত হন, গিওর শ্রেণিবিন্যাসকে প্রতিবিম্বিত কোডের হায়ারার্কিটি পদ্ধতি কলগুলির ক্রমগুলির তুলনায় একটি বিশাল উন্নতি।
opsb

88

গতিশীল প্রক্সি (1.3-এ যোগ করা) আপনাকে রানটাইমে একটি নতুন ধরণের সংজ্ঞা দিতে দেয় যা ইন্টারফেসের সাথে সঙ্গতি রাখে। এটি একটি বিস্ময়কর সংখ্যা বার ব্যবহার করা হয়েছে।


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

82

চূড়ান্ত সূচনা স্থগিত করা যেতে পারে।

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

public Object getElementAt(int index) {
    final Object element;
    if (index == 0) {
         element = "Result 1";
    } else if (index == 1) {
         element = "Result 2";
    } else {
         element = "Result 3";
    }
    return element;
}

অবাক করা ব্যাপার। কেউ কি মোটামুটি বলতে পারেন, "চূড়ান্ত ভেরিয়েবলের মান একবার সেট করা যায়", সেটটি যেখানেই ঘটে না কেন?
ডেভিড কোয়েল

29
হ্যাঁ, তবে আরও দৃ strongly়তার সাথে: "একটি চূড়ান্ত ভেরিয়েবলের মান অবশ্যই একবার সেট করতে হবে"
আল্লায়েন লালনডে

6
+1 সম্মত হন, এটি সংকলন সময়ে ত্রুটি চিহ্নিত করার জন্য আরেকটি মূল্যবান সরঞ্জাম এবং প্রোগ্রামাররা কোনও কারণে লজ্জাজনক বলে মনে হয়। নোট করুন যে জাভা 5 এর পর থেকে, 'ফাইনাল'-এ থ্রেড-সুরক্ষা সংক্রান্ত প্রভাবও রয়েছে, কনস্ট্রাক্টরের সময় একটি চূড়ান্ত পরিবর্তনশীল সেট করতে সক্ষম হওয়া অমূল্য।
নিল কফফি

4
যদিও এই নির্দিষ্ট পদ্ধতির জন্য, আমি কেবল একাধিক রিটার্ন ব্যবহার করব। আসলে, বেশিরভাগ ক্ষেত্রে যেখানে এটি প্রযোজ্য, আমি সম্ভবত এটি একটি পৃথক পদ্ধতিতে রিফ্যাক্টর করব এবং একাধিক আয় ব্যবহার করব use
ripper234

আমি এটা ভালোবাসি! আমি চূড়ান্ত কীওয়ার্ডটি সর্বদা মুছলাম কারণ আমি ভেবেছিলাম এটি ব্যর্থ হবে। ধন্যবাদ!
কারাসজি ইস্তভান

62

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

আপনি যদি কোনও নতুন ভাষা ডিজাইন করেন (যেমন স্কেল-কেসের মতো) আপনার তাত্ক্ষণিকভাবে বিদ্যমান সমস্ত গ্রন্থাগার পাওয়া যায় এবং তাই আপনার ভাষা প্রথম থেকেই "দরকারী"।

এই সমস্ত ভাষা হটস্পট অপ্টিমাইজেশন ব্যবহার করে। ভিএম খুব ভাল মনিটর এবং ডিবাগযোগ্য।


18
না এটি আসলে খুব ভাল ভিএম নয়। এটি সম্পূর্ণরূপে JAVA চালানোর জন্য ডিজাইন করা হয়েছিল। টাইপলেস গতিশীল এবং কার্যকরী ভাষাগুলি এটির সাথে ভাল কাজ করে না। আপনি কোন ভিএম ব্যবহার করতে চান আপনার NET / মনো ব্যবহার করা উচিত। এটি প্রতিটি ভাষার সাথে কাজ করার জন্য ডিজাইন করা হয়েছিল ...
হেডস 32

14
আসলে জেভিএম সম্পূর্ণরূপে জাভা বাইটকোডগুলি চালানোর জন্য ডিজাইন করা হয়েছে। আপনি জাভা বাইটকোডে বেশিরভাগ আধুনিক ভাষাগুলি সংকলন করতে পারেন। জাভা বাইটকোডের যে একমাত্র জিনিসটির অভাব রয়েছে তার সম্পর্কে হ'ল ডায়নামিক ভাষা সমর্থন, পয়েন্টার এবং লেজ পুনরাবৃত্তি সমর্থন।
mcjabberz

12
@ হেডেস 32: প্রকৃতপক্ষে। নেট ভিএম জেভিএমের সাথে বেশ মিল। এটি তুলনামূলকভাবে সম্প্রতি (ডিএলআর সহ) গতিশীল ভাষার জন্য সমর্থন পেয়েছে এবং জাভা that এটিও সমর্থন পেতে চলেছে। এবং নেট (সি #, ভিজ্যুয়াল বেসিক। নেট, ...) এর ধ্রুপদী "প্রতিটি ভাষা" সকলেরই প্রায় একই বৈশিষ্ট্য সেট রয়েছে।
জোছিম সউর

13
জেভিএম জেনারিক সমর্থন করে না, যখন। নেট ভিএম করে। জেভিএম সেরা কাছাকাছি কোথাও নেই।
অন্ধ

3
জেভিএম দ্বারা সরাসরি সমর্থন না করা নির্দিষ্ট ভাষার বৈশিষ্ট্যগুলি সম্পর্কে অভিযোগগুলি ছাড় না করার জন্য ... তবে আমি মনে করি যে স্থিতিশীলতা, ক্রস-প্ল্যাটফর্মের ধারাবাহিকতা এবং ভাল পারফরম্যান্স জেভিএম অতিরিক্ত পয়েন্ট পাওয়ার কারণে অনেক বেশি above আমি বহু বছর ধরে সার্ভার-সাইড জাভা-র সাথে এখন অনেক প্ল্যাটফর্মে (এএস / ৪০০ সহ) কাজ করে যাচ্ছি এবং এটি সম্পর্কে পুরোপুরি ভুলে যেতে পেরেছি - বাগগুলি আমি ঠিক করতে পারি এমন কোডে সবসময় থাকে এবং এটি কেবল ক্রাশ হয় না।
রব হিলান

58

আপনি কোনও বেনামে সাবক্লাস সংজ্ঞায়িত করতে পারেন এবং কোনও ইন্টারফেস প্রয়োগ না করে এমনকি এটিতে সরাসরি কোনও পদ্ধতিতে কল করতে পারেন।

new Object() {
  void foo(String s) {
    System.out.println(s);
  }
}.foo("Hello");

@ ভ্যান্টিক - এটি আপনাকে প্রয়োজনীয় প্রসঙ্গে যে কোনও সাধারণ শ্রেণির সংজ্ঞা দিতে দেয়।
কেওসপ্যান্ডিয়ন

1
@ চাওস, তবে কেন? এটি কার্যকর যেখানে একটি বাস্তব উদাহরণ পেয়েছেন?
থরবজর্ন রাভন অ্যান্ডারসন

10
@ ওয়াটার - সেক্ষেত্রে, বেনামে অবজেক্টের ( start()) নামে যে পদ্ধতিটি আহ্বান করা হয়েছে তা উপক্লাসে আসলে সংজ্ঞায়িত করা হয়নি ...
অ্যাক্সেল

প্রকৃতপক্ষে, এটি একটি খুব দরকারী বৈশিষ্ট্য যদি আপনি একটি বেস ক্লাস প্রসারিত করেন যা কিছু প্রয়োজনীয় সেটআপ করে, আপনার লেখার পদ্ধতিটিকে কল করে এবং তারপর টিয়ারডাউন করে। বেস ক্লাসে একটি পদ্ধতি কল করে জিনিসটি কিক করুন (যা আমি সম্ভবত একই নামটি দেব না)। সেখানে একটি উদাহরণ ব্যবহার (না ডেফিনেশন) এর এখানে
AmigoNico

56

AsList পদ্ধতি java.util.Arraysভারার্গস জেনেরিক পদ্ধতি এবং autoboxing একটি চমৎকার সমন্বয় অনুমতি দেয়:

List<Integer> ints = Arrays.asList(1,2,3);

15
আপনি তালিকা তৈরির সাথে ফিরিয়ে আনতে চান তালিকাটি অন্যথায় আকারগুলি স্থির হবে (যেহেতু এটি অ্যারে দ্বারা সমর্থিত হবে)
কিটসুনওয়াইএমজি

2
Arrays.asListআপনি যা করতে পারেন যে অস্বাভাবিক বৈশিষ্ট্য আছে set()উপাদানের কিন্তু add()বা remove()। সুতরাং আমি তালিকাটি সংশোধনযোগ্য কিনা তা নির্ভর করে আমি সাধারণত এটি new ArrayList(...)বা Collections.unmodifiableList(...)একটিতে মুড়ে রাখি।
খ্রিস্টান সেমরাউ

53

কোনও অভ্যন্তরীণ শ্রেণীর শ্রেণী থেকে ক্ষেত্র / পদ্ধতিতে অ্যাক্সেসের জন্য এই কীওয়ার্ডটি ব্যবহার করা । নীচে বরং পরিবর্তিত উদাহরণ হিসাবে আমরা বেনামি অভ্যন্তর শ্রেণীর থেকে ধারক শ্রেণীর ক্রমবর্ধমান ক্ষেত্রটি ব্যবহার করতে চাই। এটির পরিবর্তে কনটেইনারক্লাস.থিস.সোর্টঅ্যাকসেন্ডিং ব্যবহার করা কৌশলটি কার্যকর করে।

import java.util.Comparator;

public class ContainerClass {
boolean sortAscending;
public Comparator createComparator(final boolean sortAscending){
    Comparator comparator = new Comparator<Integer>() {

        public int compare(Integer o1, Integer o2) {
            if (sortAscending || ContainerClass.this.sortAscending) {
                return o1 - o2;
            } else {
                return o2 - o1;
            }
        }

    };
    return comparator;
}
}

4
এটি কেবলমাত্র প্রয়োজনীয় যদি আপনি নামটি ছায়াযুক্ত করেন (আপনার ক্ষেত্রে পদ্ধতি প্যারামিটারের নাম সহ)। আপনি যদি যুক্তিটিকে অন্য কিছু বলে ডাকেন, তবে আপনি সরাসরি 'এটি' ব্যবহার না করেই ধারক শ্রেণীর ক্রমবর্ধমান সদস্য ভেরিয়েবলটি অ্যাক্সেস করতে পারেন।
স্ক।

7
এনকোলেসিং ক্লাসের একটি রেফারেন্স পাওয়া এখনও দরকারী eg আপনার যদি এটি কোনও পদ্ধতি বা কনস্ট্রাস্টারের কাছে পাস করতে হয় তবে।
ফিলিহো

প্রায়শই, অ্যান্ড্রয়েড বিন্যাস উন্নয়নে ব্যবহৃত অর্ডার দিয়ে, থেকে, বলুন, একটি বোতাম শ্রোতা প্রসঙ্গ পেতে MyActivity.this
এএসপঞ্চি

52

সত্যিই কোনও বৈশিষ্ট্য নয়, তবে একটি ওয়েব কৌতূহলে আমি সম্প্রতি আবিষ্কার করেছি:

class Example
{
  public static void main(String[] args)
  {
    System.out.println("Hello World!");
    http://Phi.Lho.free.fr

    System.exit(0);
  }
}

একটি বৈধ জাভা প্রোগ্রাম (যদিও এটি একটি সতর্কতা উত্পন্ন করে)। যদি না দেখেন তবে গ্রেগরির উত্তর দেখুন! ;-) ভাল, সিনট্যাক্স এখানে হাইলাইট করা একটি ইঙ্গিত দেয়!


15
ঝরঝরে, একটি মন্তব্য সহ একটি লেবেল :)
থরবজর্ন রাভন অ্যান্ডারসন

46

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

public class UnsafeUtil {

    public static Unsafe unsafe;
    private static long fieldOffset;
    private static UnsafeUtil instance = new UnsafeUtil();

    private Object obj;

    static {
        try {
            Field f = Unsafe.class.getDeclaredField("theUnsafe");
            f.setAccessible(true);

            unsafe = (Unsafe)f.get(null);
            fieldOffset = unsafe.objectFieldOffset(UnsafeUtil.class.getDeclaredField("obj"));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    };
}

20
একটি সূর্য এপিআই যা সত্যিই SE প্রতি জাভা ভাষা অংশ নয় *।
ডিডাব্লিউ।

অনিরাপদে অনেকগুলি কৌতূহল পদ্ধতি রয়েছে যেমন কনস্ট্রাক্টর, ম্যালোক / রিলোক / ফ্রি স্টাইল পদ্ধতিগুলিকে কল না করে কোনও অবজেক্ট তৈরি করা।
পিটার লরে

আমি প্রিন্ট বিশেষভাবে মেমরি লোকেশনগুলিতে পুটডুবাল (দীর্ঘ ঠিকানা, ডাবল ডি) এর মতো আদিম প্রাপ্তি এবং সেটটারগুলি পছন্দ করি।
ড্যানিয়েল

42

যখন মত লুকানো সুইং আমি কাজ Ctrl- Shift- F1বৈশিষ্ট্য।

এটি বর্তমান উইন্ডোর উপাদান গাছটি ফেলে দেয়।
(ধরে নিচ্ছেন আপনি কী-স্ট্রোককে অন্য কোনও কিছুর সাথে আবদ্ধ করেননি।)


1
সম্ভবত আপনার উইন্ডো ম্যানেজারের কীটির সাথে কিছু আবদ্ধ রয়েছে। জিনোম এটির সাথে আবদ্ধ হয় না, তাই আমি ধরে নিচ্ছি যে আপনি কে-ডি-কে চালাচ্ছেন যা এটি 'ডেস্কটপে 13 এ স্যুইচ' করতে বাঁধা। আপনি এটি নিয়ন্ত্রণ কন্ট্রোল প্যানেলে, আঞ্চলিক, কীবোর্ড শর্টকাটগুলিতে গিয়ে এবং Shift-Ctrl-F1
ডিভন_সি_মিলার

40

প্রতিটি শ্রেণীর ফাইল হেক্স মান 0xCAFEBABE দিয়ে শুরু হয় বৈধ জেভিএম বাইটকোড হিসাবে চিহ্নিত করতে ।

( ব্যাখ্যা )


38

আমার ভোট java.util.concurrent এ যায় তার সমবর্তী সংগ্রহগুলি এবং নমনীয় নির্বাহীদের সাথে অন্যদের মধ্যে পুল, তফসিলযুক্ত কার্য এবং সমন্বিত কার্যগুলিকে থ্রেড করার অনুমতি দেয়। DelayQueue আমার ব্যক্তিগত প্রিয়, যেখানে নির্দিষ্ট বিলম্বের পরে উপাদানগুলি উপলব্ধ করা হয়।

java.util.Timer এবং টাইমার টাস্ক নিরাপদে বিশ্রামে রাখা যেতে পারে।

এছাড়াও, ঠিক লুকানো নয় তবে তারিখ এবং সময় সম্পর্কিত অন্যান্য শ্রেণি থেকে আলাদা প্যাকেজে। java.util.concurrent.TimeUnit ন্যানোসেকেন্ডস, মাইক্রোসেকেন্ডস, মিলিসেকেন্ড এবং সেকেন্ডের মধ্যে রূপান্তর করার সময় দরকারী।

এটি সাধারণ কিছু ভ্যালু * 1000 বা কিছু ভ্যালু / 1000 এর চেয়ে অনেক বেশি ভাল পড়ে।


সম্প্রতি আবিষ্কার হয়েছে CountDownLatchএবং CyclicBarrier- তাই দরকারী!
রাফেল

37

ভাষা-স্তরের জোড় কীওয়ার্ড।


19
দৃsert়তার সাথে সমস্যাটি হ'ল রানটাইম চলাকালীন এটি চালু করা দরকার।
এক্সরেনন

10
তবে এটি অক্ষম থাকলে এটি এটির মতো না। আপনি আপনার কোডটিতে যতগুলি আকাঙ্ক্ষা চান তা যুক্ত করতে পারেন এবং তারা অক্ষম থাকলে আপনার কোনও পারফরম্যান্স জরিমানা লাগবে না।
রবি ওয়ালাউ

5
আমি বিশ্বাস করি এটি দৃ about়পদ সম্পর্কে একটি ভাল জিনিস: এটি বিনা জরিমানা বন্ধ করা যেতে পারে।
andref

সমস্যাটি হ'ল, যদি আপনি দুর্ঘটনাক্রমে কোনও দৃsert়তার সাথে কোনও পার্শ্ব প্রতিক্রিয়াটি প্রয়োগ করেন তবে আপনাকে আপনার প্রোগ্রামটি কাজ করার জন্য দৃ turn় প্রতিবেদনটি চালু করতে হবে ...
চিআই

জরিমানা চালু আছে কিনা তা সনাক্ত করতে আপনি {বুলিয়ান assertsOn = false ব্যবহার করতে পারেন; assert assertsOn = সত্য; যদি (assertsOn) {/ * জটিল যাচাইকরণ * /}}} যদি দৃsert় অবস্থার প্রত্যাশা না হয় তবে এটি লগ বা ব্যতিক্রম ছোঁড়ার অনুমতি দেয়।
ফার্নাকোলো

37

সত্যিই জাভা ভাষার অংশ নয়, তবে জাভাপ বিচ্ছিন্নকরণ যা সনের জেডিকে নিয়ে আসে তা ব্যাপকভাবে পরিচিত বা ব্যবহৃত হয় না।


36

প্রতিটি লুপ নির্মাণের জন্য 1.5 তে যোগ করুন। আমি <3 এটি।

// For each Object, instantiated as foo, in myCollection
for(Object foo: myCollection) {
  System.out.println(foo.toString());
}

এবং নেস্টেড দৃষ্টান্তগুলিতে ব্যবহার করা যেতে পারে:

for (Suit suit : suits)
  for (Rank rank : ranks)
    sortedDeck.add(new Card(suit, rank));

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

// Returns the sum of the elements of a
int sum(int[] a) {
  int result = 0;
  for (int i : a)
    result += i;
  return result;
}

সূর্যের ডকুমেন্টেশনের লিঙ্ক


30
আমি মনে করি iএখানে ব্যবহার করা অত্যন্ত বিভ্রান্তিকর, কারণ বেশিরভাগ লোকেরা আশা করে যে আমি সূচী হব এবং অ্যারের উপাদান নয়।
সিডিএমকেয়ে

সুতরাং ... int যোগফল (int [] অ্যারে) {int ফলাফল = 0; (int উপাদান: অ্যারে) এর জন্য + ফলাফল + = উপাদান; } রিটার্ন ফলাফল; }
ড্রয়

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

6
এটি লজ্জাজনক বিষয় এটি জেএনডিআই-র মতো, এনওমিরেশনগুলির সাথেও কাজ করে না। এটি সেখানে পুনরাবৃত্তিকারীদের কাছে ফিরে এসেছে।
এক্সেরেনন

3
@ এক্সট্রেনন: কালেকশন.লিস্টে একবার দেখুন (গণনা <টি> ই)। এটি পূর্বাঞ্চ লুপে পুনরাবৃত্তি গণনার সাথে সহায়তা করবে।
ওয়ার্নার লেহম্যান

34

আমি ব্যক্তিগতভাবে java.lang.Voidখুব দেরীতে আবিষ্কার করেছি - জেনেরিকের সাথে একত্রে কোড পাঠযোগ্যতার উন্নতি করে, যেমনCallable<Void>


2
বেশ না। কিছু পর্যায়ে আপনাকে সুনির্দিষ্ট হতে হবে: এক্সিকিউটারস.নিউসিংলথ্রেডএক্সেকিউটার ()। (নতুন কলযোগ্য <ভাইয়েড> () {..}) জমা দিন - আপনি কোনও নতুন কলযোগ্য <?> () ইনস্ট্যান্ট করতে পারবেন না, আপনাকে নির্দিষ্ট করতে হবে একটি সুস্পষ্ট প্রকার - সুতরাং, এটি কলযোগ্য <বিকল্প> এর বিকল্প।
রাহেল লাথি

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