সি ++ তে টাইপিড কীওয়ার্ডের জন্য কি জাভা সমতুল্য বা পদ্ধতি আছে?


244

একটি সি এবং সি ++ ব্যাকগ্রাউন্ড থেকে এসেছি, আমি typedefঅবিশ্বাস্যরূপে সহায়ক হিসাবে ন্যায়বিচারের ব্যবহার খুঁজে পেয়েছি । জাভাতে একই রকম কার্যকারিতা অর্জনের কোনও উপায় আপনি কী জানেন, তা জাভা প্রক্রিয়া, প্যাটার্ন বা আপনি ব্যবহার করেছেন এমন কোনও কার্যকর উপায় হোক না কেন?


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

3
আমি যদি দেশীয় টাইপগুলি টাইপ করতে চাই তবে আমি যদি পরে এটি ক্লাসে পরিণত করতে পারি। টাইপডেফ সূচক; উদাহরণ স্বরূপ. পরে, যদি আমি সূচকে ক্লাস হতে চাই তবে আমি কেবল এটি প্রয়োগ করব এবং টাইপডেফটি সরিয়ে ফেলব। এটি তথ্য গোপনে সহায়তা করে।
জেআর লৌহর্ন

13
@ আলেকজান্ডার - আপডেট হওয়া লিংক: ibm.com/developerworks/java/library/j-jtp02216/index.html
আন্দ্রেয়াস

1
আমি জানি না এর ডাউনসাইডগুলি কী, তবে:public interface ScopeFactory { <Scope extends Map<String, Object>> Scope create(...) throws Exception; }
স্কুটিপফ

2
আপনি Scala পছন্দ করতে পারেন stackoverflow.com/a/21223102/203968
oluies

উত্তর:


112

জাভাতে আদিম ধরণের, বস্তু এবং অ্যারে রয়েছে এবং এটিই it টাইপডেফস নেই।


38
আমার ধারণা বেশিরভাগ লোকেরা typedefনতুন করে সংজ্ঞা booleanদিতে চান bool
টোমা জ্যাটো - মনিকা

66
@ টোম্যাজাটো আমি বেশিরভাগ লোককেই চিনি না, তবে আমার অভিজ্ঞতা অনুসারে এটি শব্দার্থবিজ্ঞান যুক্ত করার জন্য দরকারী: typedef int PlayerIDযা সংকলকটিকে নিশ্চিত করে তোলে যে প্লেয়ারআইডিগুলি অন্য ইন্টের সাথে আন্তঃবিন্যভাবে ব্যবহৃত হচ্ছে না, এবং এটি কোডকে মানুষের জন্য আরও পাঠযোগ্য করে তোলে makes । মূলত, এটি একটি এনামের মতো তবে মানগুলির একটি সীমিত সেট ছাড়াই।
weberc2

76
@ টোমাজাটো যেমন দীর্ঘ প্রকারের সংক্ষিপ্তসারগুলিও কার্যকর typedef MegaLongTemplateClass<With, Many, Params> IsShorten;
অ্যালেক্স মেদভেস্কেক

32
@ ওয়েবারসি 2 "যা প্লেয়ারআইডিগুলি অন্য অন্তর্নিহিতভাবে আন্তঃব্যবহারযোগ্যভাবে ব্যবহৃত হচ্ছে না তা নিশ্চিত করতে সংকলকটিকে typedefসক্ষম করে " - এমন কোনও জিনিস সক্ষম করে না। এটি কেবল একটি প্রকারের জন্য অন্য নাম দেয়।
Emlai

7
এছাড়াও দরকারী যদি উদাহরণস্বরূপ, আপনার কিছু ধরণের আইডি রয়েছে intএবং আপনাকে এটিতে পরিবর্তন করতে হবে long, আপনি যেখানে আইডির সাথে কাজ করবেন সেই কোডের প্রতিটি জায়গায় এটি পরিবর্তন করতে হবে। যদি আপনি typedefথাকতেন তবে আপনাকে কেবল এটি 1 জায়গায় পরিবর্তন করতে হবে।
জর্দো

101

যদি আপনি যা বোঝাতে চান এটি যদি আপনি বোঝাতে চান তবে আপনি ক্লাসটি প্রসারিত করতে পারবেন যা আপনি টাইপডেফ করতে চান, যেমন:

public class MyMap extends HashMap<String, String> {}

5
আমি বিতর্ক করব যে এটি সি
টাইপেইফ

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


7
আমি একই কারণেই টাইপডেফগুলি পছন্দ করি। আপনার কাছে যদি কোনও সামগ্রীর ধারক থাকে তবে টাইপডেফ পরিবর্তন করে ধারক প্রকারের অদলবদল করা সহজ। এছাড়াও, এটি শেষ ব্যবহারকারীটির কাছে ধারকটি বিমূর্ত করতে পারে (যা কখনও কখনও কাম্য হয়) is আমি সাধারণত এটি অন্য শ্রেণীর অভ্যন্তরেই করতাম, সুতরাং প্রকারটি আরও স্পষ্ট হয়ে ওঠে (যেমন MyTree.Bank, যেখানে শ্রেণি শাখাগুলি হ্যাশসেট << MyTree> {extend প্রসারিত)
জোশ পেটিট

8
যদিও এই পদ্ধতির মূল সমস্যাটি হ'ল আপনি এটি finalক্লাসের সাথে ব্যবহার করতে পারবেন না ।
জে ম্যান্সফিল্ড 21

14

জাভাতে কোনও টাইপইফ নেই ১.6 এর মতো, আপনি যা করতে পারেন তার জন্য একটি মোড়কের ক্লাস তৈরি করা যেহেতু আপনি চূড়ান্ত ক্লাসগুলি সাবক্লাস করতে পারবেন না (পূর্ণসংখ্যা, ডাবল, ইত্যাদি)


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

জাভাতে কোনও অপারেটর অত্যধিক লোড করছে না, তাই এটি কুশ্রী হয়ে যায়
মিলগুলি

9

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

Map<String, List<Integer>> 

সেই লক্ষ্যে আপনার অবশ্যই সাবক্লাস থাকা উচিত।
অন্য একটি পদ্ধতির যেটিকে বিবেচনা করা যেতে পারে তা হ'ল উদাহরণস্বরূপ আপনার কোডটিতে একটি হ্রাস হওয়া যেমন:

//@Alias Map<String, List<Integer>>  NameToNumbers;

এবং তারপরে আপনার কোড নেমটোন নাম্বারে ব্যবহার করুন এবং প্রাসঙ্গিক জাভা কোডটি প্রসেস করতে এবং জেনারেট করার জন্য একটি প্রাক সংকলক টাস্ক (এএনটি / গ্রেডল / মাভেন) রাখুন।
আমি জানি যে এই উত্তরের পাঠকদের কয়েকজনের কাছে এটি অদ্ভুত লাগবে তবে জেডিকে 5 এর আগে অনেক ফ্রেমওয়ার্ক "টীকা" প্রয়োগ করেছিল, এটি লম্বোক প্রজেক্ট এবং অন্যান্য ফ্রেমওয়ার্কগুলি করছে।


5

সত্যিই, জাভাল্যান্ডে বহন করা টাইপইডেফের একমাত্র ব্যবহার হ'ল এলিয়াসিং- অর্থাৎ একই শ্রেণীর একাধিক নাম দেওয়া। এটি হল, আপনি একটি "ক্লাস" পেয়েছেন এবং আপনি "বি" একই জিনিসটি উল্লেখ করতে চান। সি ++ এ আপনি "টাইপিডেফ বিএ" করছেন;

দুর্ভাগ্যক্রমে, তারা কেবল এটি সমর্থন করে না। তবে আপনি যদি জড়িত সমস্ত ধরণের নিয়ন্ত্রণ করেন তবে আপনি লাইব্রেরি স্তরে একটি বাজে হ্যাক টানতে পারেন- আপনি হয় A থেকে B প্রসারিত করেন বা B কে এ প্রয়োগ করতে পারেন either


14
রয়ে typedefএছাড়াও জেনেরিক ধরনের আমন্ত্রণ জন্য alias লেখা তৈরি করতে দরকারী হবে। উদাহরণস্বরূপ: typedef A<Long,String> B;(আপনি যা বর্ণনা করেছেন এটি এটির একটি বিশেষ ঘটনা হতে পারে তবে এটি ধারণাটির আবেদনকে আরও স্পষ্টভাবে দেখায়)।
igorrs

আমার ব্যবহারের ক্ষেত্রে, আমি আদিম ধরণের প্রাপ্যগুলি দিতে চাই। real_tজন্য doubleএবং boolজন্য boolean
অ্যারন ফ্র্যাঙ্ক

3

সম্ভবত এটি অন্য সম্ভাব্য প্রতিস্থাপন হতে পারে:

@Data
public class MyMap {
    @Delegate //lombok
    private HashMap<String, String> value;
}

2
আপনি কি ভাবেন না যে এটিতে এখন কোনও সমস্যা আছে কারণ যখনই আপনি myMapটাইপের উদাহরণটি সংজ্ঞায়িত করেন MyMap, আপনি কেবলমাত্র myMapInstance.value.SomeOperation()পরিবর্তে টাইপ করে প্রকৃত হ্যাশম্যাপে পরিচালনা করতে পারেন myMapInstance.SomeOperation()। এটা বিরক্তিকর, তাই না?
পারদ0114

2
আপনি এখনও আমার ম্যাপিনস্ট্যান্স করতে পারেন ome কিছু অপসারণ () - এটিই @ ডেলিগেটের জন্য
শ্রুতমুখী

3

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

যাচাইকারী ফ্রেমওয়ার্ক একটি অনগ্রসর সামঞ্জস্যপূর্ণ ভাবে একটি typedef সংজ্ঞায়িত করতে সক্ষম করে। আমি এমনকি আদিম ক্লাস যেমন intএবং চূড়ান্ত শ্রেণীর জন্যও কাজ করি String। এটির কোনও রান-টাইম ওভারহেড নেই এবং সমতা পরীক্ষাগুলি ভঙ্গ করে না।

আপনার প্রয়োজনের উপর নির্ভর করে চেকার ফ্রেমওয়ার্ক ম্যানুয়ালটিতে বিভাগের প্রকারের নাম এবং টাইপিডেফ টাইপডিফ তৈরির বিভিন্ন উপায় বর্ণনা করে।



-1

কিছু ক্ষেত্রে, একটি বাধ্যতামূলক টীকাগুলি কেবল আপনি যা খুঁজছেন তা হতে পারে:

https://github.com/google/guice/wiki/BindingAnnotations

বা আপনি যদি গুইসের উপর নির্ভর করতে না চান তবে কেবল একটি নিয়মিত টীকা দেওয়া যেতে পারে।


-6

আপনি এনাম ব্যবহার করতে পারেন, যদিও এটি টাইপফের চেয়ে অর্থহীনভাবে কিছুটা আলাদা যে এটি কেবলমাত্র একটি সীমাবদ্ধ মানগুলিকেই মঞ্জুরি দেয়। আর একটি সম্ভাব্য সমাধান হ'ল নামযুক্ত র‌্যাপার ক্লাস, যেমন

public class Apple {
      public Apple(Integer i){this.i=i; }
}

তবে এটিকে আরও বিশৃঙ্খল বলে মনে হচ্ছে, বিশেষত এই কোডটি থেকে পরিষ্কার নয় যে ক্লাসটির একটি উপাধিকার হিসাবে অন্য কোনও ফাংশন নেই।


-7

টাইপডিফ আইটেমগুলিকে নিখুঁতভাবে নির্ধারণ করতে দেয় যা তারা নয় to কিছু লোক এক্সটেনশানগুলি দিয়ে এটি ঘুরে দেখার চেষ্টা করে; এটি কেন খারাপ ধারণা তা বোঝার জন্য এখানে আইবিএম-এ পড়ুন।

সম্পাদনা: দৃ strong় প্রকারের অনুক্রমটি দরকারী জিনিস হিসাবে, আমি মনে করি না (এবং আমরা আশা করব না) typedefপরিচালিত ভাষাগুলিতে (কখনও?) এটি কুরুচিপূর্ণ লালন পালন দেখবে না ।

সম্পাদনা 2: সি # তে, আপনি কোনও উত্স ফাইলের শীর্ষে এই জাতীয় ব্যবহারের বিবৃতি ব্যবহার করতে পারেন। এটি ব্যবহৃত হয়েছে যাতে আপনার দেখানো দ্বিতীয় আইটেমটি করতে হবে না। আপনি যখন নাম পরিবর্তন দেখেন কেবল তখনই সুযোগ হয় যখন কোনও সুযোগ দুটি প্রকারের মধ্যে নামের সংঘর্ষের পরিচয় দেয়। পুনরায় নামকরণ একটি ফাইলের মধ্যেই সীমাবদ্ধ, এর বাইরে এটি ব্যবহৃত প্রতিটি পরিবর্তনশীল / পরামিতি প্রকারের সম্পূর্ণ নাম দ্বারা এটি পরিচিত।

using Path = System.IO.Path;
using System.IO;

23
"টাইপডিফ আইটেমগুলিকে স্পষ্টভাবে নির্ধারণ করতে দেয় যেগুলিতে তারা নয়" কি? টাইপএডেফ সহজেই আপনাকে টাইপের জন্য একটি উপ নাম হিসাবে অন্য নাম তৈরি করতে দেয়। প্রকারটি এখনও ঠিক একই, আপনি এটির জন্য একটি ছোট নাম পান। টাইপ অনুমানের সাথে এর কোনও যোগসূত্র নেই। -1
জাল্ফ

@ জালফ: আসলে আপনি যে বিষয়ে কথা বলছেন ঠিক তার সমাধান হিসাবে টাইপ অনুমানটি ব্যবহৃত হয়, তবে আমি অন্য একটি উদাহরণ দিয়েছি যেখানে আপনি নামের সংঘর্ষের জন্য "টাইপডিফ" ব্যবহার করতে পারেন।
স্যাম হারওয়েল

1
আপডেট হওয়া লিংক: আইবিএম
আলেকজান্ডার

@ আলেকজান্দার মালাখভ ধন্যবাদ, আমি এগিয়ে গিয়েছিলাম এবং আপনার লিঙ্কটি দিয়ে উত্তরটি আপডেট করেছি
ডেভ ম্যাককল্ল্যান্ড

-14

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


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

28
@ বিল কে: মেহ, বলুন যে আপনি স্টাডি :: ম্যাপ <ইন্ট, এসটিডি :: ম্যাপ <স্টাডি :: স্ট্রিং, বুস্ট :: শেয়ারড_প্টার <স্ট্যান্ড :: স্ট্রিং>>> কনস্টিটার এ জাতীয় কিছু টাইপ করার পরে কয়েক বার. সেক্ষেত্রে একটি নাম-সংক্ষিপ্ত টাইপইফ পাঠযোগ্যতা বাড়ায়, এতে বাধা দেয় না।
জোয়েল

22
কোনও প্রকারের পুনর্নামকরণ পাঠযোগ্যতার মারাত্মক উন্নতি করতে পারে। পড়া এবং বোঝা সহজ কি (এবং এইভাবে আরও পাঠযোগ্য :) UnmodifiableDirectedGraph<IncrediblyFancyEdgeType, IncrediblyFancyAbstractNode.EvenFancierConcreteNode>বা IncrediblyFancyGraph? আসলে এটি সম্পর্কে কী তা জানতে আমি সর্বদা সংজ্ঞাটি উল্লেখ করতে পারি। এইভাবে আমি নিশ্চিত হতে পারি যে আমি UnmodifiableDirectedGraph<IncrediblyFancyEdge,IncredilyFancyAbstractNode.SlightlyLessFancyConcreteNode>নিছক একঘেয়েমি বাদ দেব না ।
আলেকসান্দার দিমিত্রভ 21

10
@ আলেকসান্ডারডিমিট্রভ আমি জানি যে আমি এই টাইপ করার সাথে সাথে আপনার মন্তব্যটি প্রায় 3 বছরের পুরানো, তবে উদাহরণটি কতটা নিখুঁত এবং অবাস্তব তা উল্লেখ করা খুব গুরুত্বপূর্ণ বলে আমি মনে করি: এই শ্রেণীর নামের কোনওটিতেই শব্দটি নেই Enterprise
কেসি

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