জাভাতে একাধিক মান কীভাবে ফিরে আসে?


11

কখনও কখনও আপনি একটি ফাংশন থেকে একাধিক মান ফিরে আসতে চান। এটি সাধারণত জাভাতে কীভাবে হয় ?

একটি বিকল্প হ'ল এই পাইথন স্নিপেটের মতো একটি অ্যারে ব্যবহার করা যা একটি তালিকা বা টিপল দেয়:

value, success = read_unreliably()
if success:
    print value

আর একটি বিকল্প হ্যাশ / ডিক্ট ফিরে আসবে, যেমন জাভাস্ক্রিপ্ট উদাহরণ:

var result = readUnreliably()
if (result.success) {
    alert(value);
}

আর একটি হ'ল এই জাভা উদাহরণের মতো কেবল এই উদ্দেশ্যে একটি কাস্টম অবজেক্ট তৈরি করা:

ReadUnreliablyResult result = readUnreliably()
if (result.getSuccess()) {
    System.out.println(result.getValue());
}

অবশ্যই আপনি চারপাশের জিনিসগুলি পাস করার পরিবর্তে আপনার যা প্রয়োজন তা সঞ্চয় করতে কিছু বৈশ্বিক পরিবর্তনগুলিও ব্যবহার করতে পারেন তবে আসুন আমরা এটি বলি যে এটি কোনও বিকল্প নয়।


"প্রকৃত" জাভা লোকেরা কি এরকম সামান্য অভ্যন্তরীণ ক্লাসগুলিতে ক্ষেত্রগুলি আড়াল করার জন্য পাবলিক গেটার এবং সেটটারগুলি ব্যবহার করার ঝামেলা দিয়ে যায়? উৎসুক.
ক্রিস কৃষক

3
হ্যাঁ, বেশিরভাগ করুন। যেহেতু অনেকগুলি ফ্রেমওয়ার্ক জাভাবিয়ান স্ট্যান্ডার্ডের প্রত্যাশা করে, আপনি গেটার এবং সেটটার না থাকার জন্য আফসোস করতে পারেন। যাই হোক না কেন, আপনার আইডিই এগুলি আপনার জন্য উত্পন্ন করবে।
এরিক উইলসন

3
অথবা আপনি কেবল YAGNI নীতির ভিত্তিতে এগুলি ছেড়ে যেতে পারেন। তবে এটি কখনই প্রত্যাশিত হিসাবে ঘটবে বলে মনে হয় না।
ম্যাট্রিক্সফ্রোগ

@ ফারমবয়: আমার ধারণা আমি মটরশুটি এবং এর জন্য বুঝতে পেরেছি, কিন্তু ওপি বোঝায় যে এটি কেবলমাত্র এক-শ্রেণীর শ্রেণি যা একাধিক মূল্যবোধ ফেরত দেওয়ার জন্য ডিজাইন করা হয়েছে।
ক্রিস কৃষক

@ ক্রিসফর্মার আমি অনুমান করি যে সেই প্রসঙ্গে, আমি কখনও 'আসল' জাভা প্রোগ্রামারকে এই উদ্দেশ্যে একটি ক্লাস তৈরি করতে দেখিনি।
এরিক উইলসন

উত্তর:


26

এটি সাধারণত জাভাতে কীভাবে হয়?

Painfully।

একটি বিকল্প হ'ল এই পাইথন স্নিপেটের মতো একটি অ্যারে ব্যবহার করা যা একটি তালিকা বা tuple ফেরত দেয় ...

আর একটি বিকল্প হ্যাশ / ডিক্ট ফিরে আসবে, যেমন জাভাস্ক্রিপ্ট উদাহরণ হিসাবে ...

এই কৌশলগুলি জাভাতে ভাল কাজ করে না; মানগুলি অবজেক্ট থেকে হ্রাস করতে হবে।

আরও একটি হ'ল এই জাভা উদাহরণের মতো কেবল এই উদ্দেশ্যে একটি কাস্টম অবজেক্ট তৈরি করা ...

এটি সবচেয়ে সাধারণ, তবে এই সমস্ত ছোট্ট ক্লাস তৈরি করা ক্লান্তিকর ious সি ++ তে স্টাডি :: জোড় ব্যবহার করা সাধারণ তবে এটি জাভাতে সাধারণত হয় না।

সঙ্গে Lombok এটা সামান্য কাস্টম বস্তু তৈরি করতে বেশ সহজ:

@RequiredArgsConstructor
public class X {
  private final boolean status;
  private final byte[] data;

}


10
"জাভাতে এটি কীভাবে করা হয়?" "Painfully।" জাভা বিকাশকারী হিসাবে
LOL এর

একটি কমপ্যাক্ট অপরিবর্তনীয় কাঠামোর মতো শ্রেণি ব্যবহার করা এত বেদনাদায়ক নয় ... এটি সত্যিই কোনও সি স্ট্রাক লেখার মতো ...
গিলাইলে

1
@ গুইলুম - নিশ্চিত, তবে এই সমস্ত ছোট জিনিসই সময় এবং স্থান উভয়ই বাড়িয়ে তোলে। আমি জানি না কেন জাভা সম্প্রদায় "ক্লাস পেয়ার <টি 1, টি 2> {পাবলিক টি 1 প্রথমে; পাবলিক টি 2 সেকেন্ড; ...}"; এর মতো জেনেরিকের মানক সেট কেন গ্রহণ করল না; আধুনিক ভাষায় আপনি কেবল "রিটার্ন এ, বি"; এবং তারপরে "x, y = f ()" লিখুন;
কেভিন ক্লিন

1
আমি নিশ্চিত যে কিছু 'প্রাচীন' ভাষা এটি করতে সক্ষম হয় :) আমি একাধিক রিটার্ন মানগুলি মোট গোলমেলে যেতে পারে এবং আপনি যদি অন্য রিটার্ন ক্ষেত্র যুক্ত করতে চান তবে আপনাকে কেবল বিন্যাস ছাড়াই আপনার কাঠামোর আপডেট করতে হবে আপনার পদ্ধতি স্বাক্ষর পরিবর্তন।
গিলিয়াম

1
যে "বেদনাদায়ক।" আমাকে কঠোরভাবে আঘাত করেছে, হ্যাঁ, আমি যখন জাভা বিকাশকারী হিসাবে একই রকম পরিস্থিতি পূরণ করি তখন ঠিক একইরকম অনুভব করি।
আর্টজম

13

হ্যাঁ, জাভাতে struct/ tuple/ recordতৈরি করার উপায়টি একটি ক্লাস তৈরি করে। যদি এটি কেবল অভ্যন্তরীণ ব্যবহারের জন্য হয় তবে আমি পাবলিক ক্ষেত্রগুলির সাথে একটি ছোট অপরিবর্তনীয় কাঠামোর মতো শ্রেণি ব্যবহার করতে পছন্দ করি।

উদাহরণ:

public class Unreliably {
    public final boolean success;
    public final int value;
    public Unreliably(boolean success, int value) {
        this.success = success; this.value = value;
    }
}

স্কালায় এটি করা খুব সহজ:

case class Unreliably(success: Boolean, value: Int)

8
প্রকৃতপক্ষে, স্কালায়, আপনি সম্ভবত সাধারণত একটি ফিরে আসবেন Tuple2[Boolean, Int]। যদিও এই নির্দিষ্ট উদাহরণে, আপনি একটি ফেরত চাইবেন Option[Int]
জার্গ ডব্লু মিট্টাগ

2
সুতরাং এটি ক্রিস ফার্মারের প্রশ্নের উত্তর দেয় (কিউ এর মন্তব্যে) যে আসল জাভা লোকেরা অগত্যা সামান্য অভ্যন্তরীণ ক্লাসের জন্য গেটার এবং সেটটার তৈরি করে না। আপনি একজন "প্রকৃত" জাভা ব্যক্তি, তাই না?
মাইক এম লিন

2
অন্যান্য খবরে সত্যিকারের স্কটসম্যান নেই।
জোসেফ ওয়েইসমান

5

আপনি যে উদাহরণটি দিয়েছেন, উদাহরণস্বরূপ, ব্যতিক্রম ছোঁড়া এটি হ্যান্ডেল করার সর্বোত্তম স্ট্যান্ডার্ড উপায়:

try {
    result = readUnreliably();
    System.out.println(result);
} (catch IOException e) {
    System.out.println("Could not read file");
}

তদুপরি, যদি আপনার মাঝে মাঝে সুবিধাজনক হলেও একাধিক মান ফিরিয়ে দেওয়ার বৈশিষ্ট্যটি "একটি কাজ করুন" তেমন প্রয়োজন হয় তবে


4

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

public class Pair<A, B>
{
    ...
}

1
এটি যদিও কিছু সত্যিই অপঠনযোগ্য কোডের জন্য তৈরি করে। যদি কোনও পদ্ধতি ফিরে আসে Pair<String, Integer>তবে এর অর্থ কী? এই মানগুলি কী উপস্থাপন করে? আপনি পদ্ধতিটির বাস্তবায়ন না পড়ে সম্ভবত জানতে পারবেন না।
সারা

1

জাভাতে, আপনার ফাংশনটি কোনও বস্তু ফেরত দেবে (বা ব্যর্থতার ক্ষেত্রে সম্ভবত নাল)। এইভাবে, একাধিক টুকরো ডেটা ফেরত দেওয়া যেতে পারে।


1

জাভাতে একাধিক ভেরিয়েবলগুলি ফিরিয়ে দেওয়ার কোনও সুস্পষ্ট উপায় নেই, তবে কয়েকটি উপায় রয়েছে:

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