(স্ট্রিং) বা। স্ট্রিং ()?


89

Object oপ্যারামিটার সহ আমার একটি পদ্ধতি আছে ।

এই পদ্ধতিতে, আমি ঠিক জানি যে String"ও" তে একটি আছে যা শূন্য নয়। চেক করার দরকার নেই, বা অন্য কিছু করার দরকার নেই। আমাকে এটি ঠিক একটি Stringবস্তুর মতো আচরণ করতে হবে ।

কেবল কৌতূহল - সস্তা কি - এটিতে castালাই String, বা ব্যবহার Object.toString()? অথবা সময়-/ সিপিইউ / / মেমো-দাম অনুসারে এটি একই?

আপডেট: পদ্ধতিটি গ্রহণ করে Objectকারণ এটি একটি ইন্টারফেসের প্রয়োগ। প্যারামিটারের ধরনটি পরিবর্তন করার কোনও উপায় নেই।

এবং এটি মোটেও হতে পারে না null। আমি কেবল এটিই বলতে চেয়েছিলাম যে নালিকা বা শূন্যতার জন্য এটি পরীক্ষা করার দরকার নেই। আমার ক্ষেত্রে, সর্বদা একটি মজাদার স্ট্রিং থাকে।


4
.NET বিশ্বে, আমরা এটি পরিমাপ করেছি এবং টোস্ট্রিং () আরও দ্রুত। এটি কেন হয় তার কারণ বিবেচনা করে, একটি জেটিএম জেএমএমের প্রায় একই ঘটনা সত্য।
জোশুয়া

উত্তর:


73

একটি স্ট্রিংে কাস্টিং সস্তা, কারণ এটির জন্য কোনও বাহ্যিক ফাংশন কলের প্রয়োজন হয় না, কেবল অভ্যন্তরীণ ধরণের চেকিং।


4
আপনি একাধিক জেআরই জুড়ে এটি পরীক্ষা করেছেন? .NET- এ এই পরিস্থিতিটি বিস্মৃত করার জন্য আমি অবাক করা ফলাফল দেখেছি। বাস্তববাদী আমি সন্দেহ করি যে পারফরম্যান্সটি বাস্তব জীবনে গুরুত্বপূর্ণ হবে - তবে রক্ষণাত্মক কোডিং দৃষ্টিকোণ থেকে ingালাই ভাল।
জন স্কিটি

পদ্ধতি কলটি অন্তর্ভুক্ত করা উচিত। (স্পষ্ট) কাস্ট অপসারণ করতে জেনেরিক ব্যবহার করা সবচেয়ে সেরা হবে।
টম হাটিন -

@ জোন স্কিট: আমি সম্মত হই যে পারফরম্যান্সের পার্থক্য খুব বেশি হবে না। @ টম হাটিন: যেহেতু যে বস্তুর প্রকারটি প্রাপ্ত হবে তা যেহেতু সংকলনের সময় জানা যায়নি তাই পদ্ধতি কলটি কীভাবে অন্তর্ভুক্ত হতে পারে তা আমি দেখতে পাচ্ছি না। আপনি কি স্পষ্ট করে বলতে পারবেন?
euphoria83

@ ইউফোরিয়া ৩৩: জাভ্যাকের মাধ্যমে নয়, জেআইটি সংকলক দ্বারা ইনিলাইনড।
মাইকেল মায়ার্স

আসলে, না, পদ্ধতিটি ইনলাইন করা যায় না। প্রকারটি কেবল অবজেক্ট হিসাবে পরিচিত এবং প্রকৃত বাস্তবায়ন রানটাইম টাইপের উপর নির্ভর করে। কোনটি দ্রুততর তা এখনও বাস্তবায়নের উপর নির্ভর করে, তবে যতদূর আমার মনে আছে (আমি আসলে এটি এক পর্যায়ে মাইক্রোব্যাঙ্কমার্ক দিয়ে পরীক্ষা করেছি), কাস্টিং দ্রুততর বলে মনে হচ্ছে। এটি কোনও সুস্পষ্ট উত্তর নয়: টাইপ চেকিং সবসময় দ্রুত হয় না। স্ট্রিং টাইপের ক্ষেত্রে এটি যেহেতু এটি কোনও অবজেক্ট (ইন্টারফেস নয়) হতে পারে এবং এটি চূড়ান্ত।
স্ট্যাকসমান

45

আমি একটি castালাই ব্যবহার করব। এটি আপনার "জ্ঞান" যা এটি একটি স্ট্রিং যাচাই করে। যদি কোনও কারণে আপনার বাগটি শেষ হয়ে যায় এবং কেউ স্ট্রিং ব্যতীত অন্য কোনও কিছুতে পাস করে তবে আমি মনে করি ত্রুটিযুক্ত ডেটা দিয়ে মৃত্যুদন্ড চালিয়ে যাওয়ার চেয়ে একটি ব্যতিক্রম (যা কোনও কাস্ট করবে) ফেলে দেওয়া ভাল।


37

মূর্খ পারফরম্যান্স সংগীত অনুসারে : x.toString () বনাম (স্ট্রিং) এক্স

শেষ প্রান্তে, ফলাফলগুলি আশ্চর্যজনকভাবে পরিষ্কার: অবজেক্ট.টোস্ট্রিং () কল করার চেয়ে স্ট্রিংকে অবজেক্ট কাস্ট করা কমপক্ষে দ্বিগুণ দ্রুত is


4
আমি এখন এই কোডটি চালিয়েছি, পার্থক্য নগণ্য (ম্যাক, জাভা 8)
স্টিফান এল

7

যদি আপনি জানেন যে অবজেক্ট ও একটি স্ট্রিং, আমি বলব এটি কেবল একটি স্ট্রিংয়ের কাছে ফেলে দিন এবং এটি প্রয়োগ করুন। আপনি নিশ্চিতভাবে জানেন যে কোনও অবজেক্টে টু স্ট্রিং () কল করা একটি স্ট্রিং সম্ভবত বিভ্রান্তি যোগ করতে পারে।

যদি অবজেক্ট ও স্ট্রিং ব্যতীত অন্য কিছু হতে পারে তবে আপনাকে টুস্ট্রিং () কল করতে হবে।


এটি আমার জন্য সঠিক উত্তর। কেন? কারণ (string)Registry.GetValue...castালাই একটি অন্তর্বর্তী 32 টি বস্তু কাস্ট করার চেষ্টা করার জন্য একটি ব্যতিক্রম ছুঁড়ে ফেলেছে, যেখানে Registry.GetValue...ToString()প্রত্যাশা অনুযায়ী কাজ করে।
মাধ্যাকর্ষণ

3

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

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

OTOH, যদি ইনপুটটি সর্বদা হয় Stringবা হয় তবে nullকেবলমাত্র গ্রহণ করার পদ্ধতিটি পরিবর্তন করুন Stringএবং এর জন্য স্পষ্টতই পরীক্ষা করুন null(যা আপনার যখনই অ-আদিমদের সাথে লেনদেন করেন তখনই করা উচিত ...)


আমি বলেছিলাম যে আমার প্রশ্নের কোনও মূল্যবান অর্থ নেই :) তাত্ত্বিকভাবে সস্তা যে আমি কেবল আগ্রহী । তবে যাইহোক
থ্যাঙ্কস

ভার্চুয়াল পদ্ধতি কল কল বনাম টাইপ চেকিংয়ে ভিএম কতটা দক্ষ তার উপর নির্ভর করবে। এটি বাস্তবায়ন-নির্দিষ্ট।
জন স্কিটি

2

প্রদত্ত রেফারেন্স টাইপটি একটি অবজেক্ট এবং সমস্ত অবজেক্টের একটি টুস্ট্রিং রয়েছে () শুধু অবজেক্ট টু স্ট্রিং () কল করুন। স্ট্রিং.টোস্ট্রিং () কেবল এটিকে রিটার্ন দেয়।

  • toString () টাইপ করার জন্য কম কোড।
  • টুস্ট্রিং () এর বাইকোড কম।
  • ingালাই একটি ব্যয়বহুল অপারেশন ভিএস একটি পলিমারফিক কল।
  • কাস্ট ব্যর্থ হতে পারে।
  • স্ট্রিং.ভ্যালুওফ (অবজেক্ট) ব্যবহার করুন যা কেবল অবজেক্ট.টোস্ট্রিং () কল করে না যদি এটি শূন্য না হয়।

1

আপনার "ও" তে যদি স্ট্রিং থাকে তবে তার চেয়ে বেশি পার্থক্য নেই (সম্ভবত কাস্টটি দ্রুত, তবে এটি একটি ভিএম / গ্রন্থাগার বাস্তবায়ন জিনিস)।

যদি "ও" স্ট্রিং নাও হতে পারে তবে এটি একটি স্ট্রিং হিসাবে অনুমিত হয় তবে নিক্ষিপণটি যা চান তা চান (তবে আপনার পদ্ধতিটি কোনও অবজেক্টের পরিবর্তে একটি স্ট্রিং নেওয়া উচিত)।

যদি "ও" কোনও ধরণের হতে পারে তবে আপনাকে টসস্ট্রিংটি ব্যবহার করতে হবে - তবে প্রথমে শূন্যতার জন্য পরীক্ষা করা নিশ্চিত হন।

void foo(final Object o)
{
    final String str;

    // without this you would get a class cast exception
    // be wary of using instanceof though - it is usually the wrong thing to do
    if(o instanceof String)
    {
        str = (String)o;
    }    
}

বা

void foo(final Object o)
{
    final String str;

    // if you are 100% sure that o is not null then you can get rid of the else
    if(o != null)
    {
        str = o.toString();
    }
}

আমি বরং শেষটিকে কোড করব:

void foo(final Object o)
{
    final String str;

    if(o == null)
    {
        throw new IllegalArgumentException("o cannot be null");
    }

    str = o.toString();
}

প্রথম 2 স্নিপেটগুলি সত্যই সংকলন করবে না ( finalভেরিয়েবলটি আরম্ভ করা হয়নি)। আপনার elseএমন একটি দরকার যা হয় ব্যতিক্রম ছুঁড়ে মারবে বা কোনও strকিছুতে আরম্ভ করবে।
ব্রুনো রিস

1

আমি অদ্ভুতভাবে দেখতে পেলাম যে কাস্টটি টাস্টিং কল দ্বারা ইঙ্গিত করা ভেটেবল লুকআপের চেয়ে ধীর ছিল।


1

'O এ নাল স্ট্রিং থাকতে পারে না। যদি ওটি নাল হয় তবে এটিতে নাল স্ট্রিং থাকে না, এটি কেবল নাল। প্রথমে শূন্যতার জন্য ও পরীক্ষা করুন। আপনি কাস্ট বা টুস্ট্রিং () নূলে কল করলে আপনি ক্রাশ হয়ে যাবেন।


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