"সাম্প্রতিক টাইপ @ 2f92e0f4" না পেয়ে আমি কীভাবে আমার জাভা বস্তুটি মুদ্রণ করব?


299

আমার নিম্নরূপে একটি ক্লাস সংজ্ঞায়িত হয়েছে:

public class Person {
  private String name;

  // constructor and getter/setter omitted
}

আমি আমার ক্লাসের একটি উদাহরণ মুদ্রণের চেষ্টা করেছি:

System.out.println(myPerson);

কিন্তু আমি নিম্নলিখিত আউটপুট করেছেন: com.foo.Person@2f92e0f4

যখন আমি একটি Personবস্তুর অ্যারে মুদ্রণের চেষ্টা করেছি তখন একই রকম ঘটনা ঘটেছিল :

Person[] people = //...
System.out.println(people); 

আমি আউটপুট পেয়েছি: [Lcom.foo.Person;@28a418fc

এই আউটপুট মানে কি? আমি কীভাবে এই আউটপুটটি পরিবর্তন করব যাতে এতে আমার ব্যক্তির নাম থাকে? এবং আমি কীভাবে আমার সামগ্রীর সংগ্রহগুলি মুদ্রণ করব?

দ্রষ্টব্য : এটি এই বিষয় সম্পর্কে একটি প্রমিত প্রশ্নোত্তর হিসাবে উদ্দেশ্য।


1
আপনি জেসন এবং তদ্বিপরীতকে রূপান্তর করতে জিএসএন লাইব্রেরি ব্যবহার করতে পারেন । ডিবাগিংয়ের জন্য খুব দরকারী।
আশীষ রাওয়াত

উত্তর:


403

পটভূমি

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

System.out.println(myObject);  // invokes myObject.toString()

এই পদ্ধতিটি Objectক্লাসে সংজ্ঞায়িত করা হয়েছে (সমস্ত জাভা সামগ্রীর সুপারক্লাস)। Object.toString()পদ্ধতি মোটামুটি কুদর্শন স্ট্রিং, বর্গ, একটি নাম গঠিত ফেরৎ @প্রতীক ও হ্যাশকোড হেক্সাডেসিমেল বস্তুর। এর জন্য কোডটি দেখে মনে হচ্ছে:

// Code of Object.toString()
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

ফলাফল হিসাবে com.foo.MyType@2f92e0f4যেমন ব্যাখ্যা করা যেতে পারে:

  • com.foo.MyType - ক্লাসের নাম, অর্থাৎ ক্লাসটি MyTypeপ্যাকেজে রয়েছে com.foo
  • @ - স্ট্রিং একসাথে যোগদান
  • 2f92e0f4 বস্তুর হ্যাশকোড

অ্যারে ক্লাসগুলির নামটি কিছুটা আলাদা দেখায়, যা জাভাডোক্সে ভালভাবে ব্যাখ্যা করা হয়েছে Class.getName()। উদাহরণস্বরূপ, এর [Ljava.lang.Stringঅর্থ:

  • [- একটি একক মাত্রিক অ্যারে (যেমন [[বা এর বিপরীতে [[[)
  • L - অ্যারেতে একটি শ্রেণি বা ইন্টারফেস রয়েছে
  • java.lang.String - অ্যারেতে বস্তুর ধরণ

আউটপুট কাস্টমাইজ করা

ভিন্ন কিছু আপনি কল যখন মুদ্রণ করতে System.out.println(myObject), আপনাকে অবশ্যই ওভাররাইডtoString() আপনার নিজের ক্লাসে পদ্ধতি। এখানে একটি সাধারণ উদাহরণ:

public class Person {

  private String name;

  // constructors and other methods omitted

  @Override
  public String toString() {
    return name;
  }
}

এখন যদি আমরা একটি মুদ্রণ করি তবে আমরা Personতাদের নামটি না দেখি com.foo.Person@12345678

মনে রাখবেন যে কোনও বস্তুকে স্ট্রিংয়ে রূপান্তরিত করার জন্য toString()কেবলমাত্র একটি উপায়। সাধারণত এই আউটপুটটি পরিষ্কারভাবে এবং সংক্ষিপ্তভাবে আপনার অবজেক্টকে পুরোপুরি বর্ণনা করতে হবে। toString()আমাদের Personশ্রেণীর জন্য আরও ভাল হতে পারে:

@Override
public String toString() {
  return getClass().getSimpleName() + "[name=" + name + "]";
}

যা মুদ্রণ করবে, যেমন Person[name=Henry],। এটি ডিবাগিং / পরীক্ষার জন্য ডেটা সত্যিই দরকারী টুকরা।

আপনি যদি নিজের অবজেক্টের কেবল একটি দিকের দিকে মনোনিবেশ করতে চান বা প্রচুর জাজি ফর্ম্যাটিং অন্তর্ভুক্ত করতে চান তবে এর পরিবর্তে আপনি একটি পৃথক পদ্ধতি সংজ্ঞায়িত করার চেয়ে ভাল হতে পারেন String toElegantReport() {...}


আউটপুট স্বয়ংক্রিয়ভাবে উত্পন্ন হচ্ছে

ক্লাসের ক্ষেত্রগুলির উপর ভিত্তি করে অনেক আইডিই একটি toString()পদ্ধতি স্বয়ংক্রিয়ভাবে উত্পন্ন করার জন্য সহায়তা দেয় offer উদাহরণস্বরূপ, Eclipse এবং IntelliJ এর জন্য ডকগুলি দেখুন ।

বেশ কয়েকটি জনপ্রিয় জাভা লাইব্রেরিও এই বৈশিষ্ট্যটি সরবরাহ করে। কিছু উদাহরণ অন্তর্ভুক্ত:


বস্তুর মুদ্রণ গোষ্ঠী

সুতরাং আপনি toString()আপনার শ্রেণীর জন্য একটি সুন্দর তৈরি করেছেন । যদি সেই শ্রেণিটি একটি অ্যারে বা কোনও সংকলনে স্থাপন করা হয় তবে কী হবে?

অ্যারেগুলির

আপনার যদি অবজেক্টগুলির একটি অ্যারে থাকে তবে আপনি অ্যারের Arrays.toString()সামগ্রীর একটি সহজ উপস্থাপনা উত্পাদন করতে কল করতে পারেন । উদাহরণস্বরূপ, Personঅবজেক্টের এই অ্যারেটি বিবেচনা করুন :

Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));

// Prints: [Fred, Mike]

দ্রষ্টব্য: এটি অ্যারে ক্লাসে ডাকা একটি স্ট্যাটিক পদ্ধতির কল toString(), যা আমরা উপরে আলোচনা করছি তার থেকে আলাদা।

আপনার যদি একটি বহুমাত্রিক অ্যারে থাকে তবে আপনি Arrays.deepToString()একই ধরণের আউটপুট অর্জন করতে ব্যবহার করতে পারেন ।

সংগ্রহগুলি

বেশিরভাগ সংগ্রহগুলি .toString()প্রতিটি উপাদানকে কল করার উপর ভিত্তি করে একটি সুন্দর আউটপুট উত্পাদন করে।

List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));    
System.out.println(people);

// Prints [Alice, Bob]

সুতরাং আপনাকে কেবল নিশ্চিত করতে হবে যে আপনার তালিকা উপাদানগুলি toString()উপরে বর্ণিত হিসাবে একটি দুর্দান্ত সংজ্ঞা দিয়েছে ।


return String.format( getClass().getSimpleName() + "[ name=%s ]", name);এবং প্রকৃতপক্ষে এর পরিবর্তে nameগিটারটি ব্যবহার করা উচিত getName()(তবে প্রাপ্ত ব্যক্তিদের ব্যক্তিগত শ্রেণিতে বাদ দেওয়া হয়েছিল ...) তবে যদি কোনও গেটর ব্যবহার করা হয় ...return String.format( getClass().getSimpleName() + "[ name=%s ]", getName());
CrandellWS

যদি জাভা ফাইলে আমার দুটি ক্লাস থাকে তবে ক্লাসের অবজেক্ট কীভাবে তৈরি করা যায় যা পাবলিক নয়। জাভা পাবলিক ক্লাস এ}} ক্লাস বি {} ------ সি। জাভা পাবলিক ক্লাস সি {এ এ = নতুন এ ( ); }
yatinbc

মনে রাখবেন যে ওভারলোড হওয়া সংস্করণ রয়েছে Arrays.toString()তাই আপনি এটি আদিমদের অ্যারেগুলির জন্যও ব্যবহার করতে পারেন ( int[], double[])। এছাড়াও Arrays.deepToString()আদিমতার বহুমাত্রিক অ্যারেগুলি সুন্দরভাবে পরিচালনা করে।
ওলে ভিভি

কেন স্ট্রিং () হ্যাশ কোডটিকে হেক্সে রূপান্তর করে?
মাস্টারজয়ে ২২

1
@ মাস্টারজো 2 নিশ্চিত নন, সম্ভবত তারা ভেবেছিল এটি স্ট্রেসের মধ্যে নেতিবাচক মানগুলি এনকোড করার চেষ্টা করা কুৎসিত দেখায়?
ডানকান জোন্স

54

আমি মনে করি অ্যাপাচি আরও ভাল ব্যবহারের ক্লাস সরবরাহ করে যা স্ট্রিং পেতে ফাংশন সরবরাহ করে

ReflectionToStringBuilder.toString(object)

5
এটির সুবিধাটি রয়েছে যে এটি ক্লাস সম্পাদনা করার প্রয়োজন হয় না, যা কখনও কখনও সম্ভব হয় না। তবে, আমি কীভাবে পুনরাবৃত্তভাবে নেস্টেড অবজেক্টগুলি মুদ্রণ করতে পারি?
lukas84

34

জাভাতে প্রতিটি শ্রেণীর toString()ডিফল্টরূপে এটিতে পদ্ধতি থাকে, যা আপনি যদি সেই শ্রেণীর কোনও বস্তু পাস করেন তবে তাকে বলা হয় System.out.println()। ডিফল্টরূপে, এই কলটি সেই বস্তুর ক্লাসের নাম @ হ্যাশকোড প্রদান করে।

{
    SomeClass sc = new SomeClass();
    // Class @ followed by hashcode of object in Hexadecimal
    System.out.println(sc);
}

বিভিন্ন আউটপুট পেতে আপনি কোনও শ্রেণীর টসস্ট্রিং পদ্ধতিকে ওভাররাইড করতে পারেন। এই উদাহরণটি দেখুন

class A {
    String s = "I am just a object";
    @Override
    public String toString()
    {
        return s;
    }
}

class B {
    public static void main(String args[])
    {
        A obj = new A();
        System.out.println(obj);
    }
}

3
এটি একটি সুস্পষ্ট এবং সংক্ষিপ্ত উত্তর, তবে ওপি [Lcom.foo.Person;@28a418fcআউটপুট হিসাবে কেন পাচ্ছে তা স্পষ্ট করে বলা : এটি toString()পদ্ধতির আউটপুটও, তবে ধরণের জন্য রানটাইম সময়ে উত্পন্ন যে শ্রেণিতে প্রয়োগ করা হয় Person[], তা নয় Person(দেখুন) stackoverflow.com/a/8546532/1542343 )।
gvlasov

এই আউটপুটটির অর্থ প্যাকেজ C ক্লাস @ হ্যাশকোড। ডিফল্ট টু স্ট্রিং () পদ্ধতিতে রিটার্ন টাইপের মতো রয়েছে। অবজেক্ট.হ্যাসকোড () বা কিছু অনুরূপ রিটার্ন স্টেটমেন্ট যা ক্লাসের নাম সহ হেক্সাডেসিমাল ফর্মে হ্যাশকোড প্রত্যাবর্তন করছে।
পঙ্কজ মানালি

14

Eclipse এ, আপনার ক্লাসে যান, ডান ক্লিক করুন-> উত্স-> উত্পন্ন করুন toString();

এটি toString()পদ্ধতিটিকে ওভাররাইড করবে এবং সেই শ্রেণীর অবজেক্টটি মুদ্রণ করবে।


10

আমি কোনও ইউটিলিটি ফাংশনটি ব্যবহার করতে পছন্দ করি যা জাএসঅন স্ট্রিংয়ে জাভা অবজেক্টটিকে ডি-সিরিয়ালাইজ করতে GSON ব্যবহার করে।

/**
 * This class provides basic/common functionalities to be applied on Java Objects.
 */
public final class ObjectUtils {

    private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();

    private ObjectUtils() {
         throw new UnsupportedOperationException("Instantiation of this class is not permitted in case you are using reflection.");
    }

    /**
     * This method is responsible for de-serializing the Java Object into Json String.
     *
     * @param object Object to be de-serialized.
     * @return String
     */
    public static String deserializeObjectToString(final Object object) {
        return GSON.toJson(object);
    }
}

এটি হওয়া উচিত return Gson.toJson(object);, অন্যথায় নিখুঁতভাবে কাজ করুন।
নাকরুল

এটা শুধুমাত্র।
আগাম

5

ইন্টেলিজে আপনি Alt + ইনসেট টিপুন এবং তারপরে টসস্ট্রিং () নির্বাচন করে এখানে স্ট্রিং পদ্ধতিটি স্বয়ংক্রিয়ভাবে জেনারেট করতে পারেন এটি একটি পরীক্ষার শ্রেণীর জন্য রাখা হয়েছে:

public class test  {
int a;
char b;
String c;
Test2 test2;

@Override
public String toString() {
    return "test{" +
            "a=" + a +
            ", b=" + b +
            ", c='" + c + '\'' +
            ", test2=" + test2 +
            '}';
 }
}

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


4

ডিফল্টরূপে, জাভাতে প্রতিটি অবজেক্টের এমন toString()পদ্ধতি রয়েছে যা অবজেক্টটাইপ @ হ্যাশকোডকে আউটপুট করে।

আপনি যদি আরও অর্থবহুল তথ্য চান তবে toString()আপনার ক্লাসে পদ্ধতিটি ওভাররাইড করা দরকার ।

public class Person {
  private String name;

  // constructor and getter/setter omitted

  // overridding toString() to print name
  public String toString(){
     return name;  
  }
}

এখন আপনি যখন সেই ব্যক্তিকে ব্যবহার করে System.out.prtinln(personObj);এটি মুদ্রণ করবেন তখন শ্রেণীর নাম এবং হ্যাশকোডের পরিবর্তে ব্যক্তির নাম মুদ্রণ করা হবে।

আপনার দ্বিতীয় ক্ষেত্রে যখন আপনি অ্যারে প্রিন্ট করার চেষ্টা করছেন, এটি অ্যারের প্রিন্ট [Lcom.foo.Person;@28a418fcকরে এবং এটি হ্যাশকোড।


আপনি যদি সেই ব্যক্তির নাম মুদ্রণ করতে চান তবে অনেকগুলি উপায় রয়েছে।

আপনি নিজের ফাংশন লিখতে পারেন যা প্রতিটি ব্যক্তিকে পুনরুক্তি করে এবং মুদ্রণ করে

void printPersonArray(Person[] persons){
    for(Person person: persons){
        System.out.println(person);
    }
}

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

 System.out.println(Arrays.toString(persons));
 System.out.println(Arrays.deepToString(persons));  // for nested arrays  

আপনি এটি জাভা 8 উপায়ে মুদ্রণ করতে পারেন (স্ট্রিম এবং পদ্ধতি রেফারেন্স ব্যবহার করে)।

 Arrays.stream(persons).forEach(System.out::println);

অন্যান্য উপায়ও থাকতে পারে। আশাকরি এটা সাহায্য করবে. :)


3

আপনি যদি সরাসরি কোনও ব্যক্তির কোনও বস্তু মুদ্রণ করেন তবে ClassName@HashCodeতা কোডের হাতে চলে যাবে।

আপনার ক্ষেত্রে com.foo.Person@2f92e0f4মুদ্রিত হচ্ছে। Personকোন শ্রেণীর কোথায় কোন বস্তুর সাথে সম্পর্কিত এবং 2f92e0f4এটি অবজেক্টের হ্যাশকোড।

public class Person {
  private String name;

  public Person(String name){
  this.name = name;
  }
  // getter/setter omitted

   @override
   public String toString(){
        return name;
   }
}

এখন আপনি যদি অবজেক্টটি ব্যবহার করার চেষ্টা করেন Personতবে এটি নামটি মুদ্রণ করবে

Class Test
 {
  public static void main(String... args){
    Person obj = new Person("YourName");
    System.out.println(obj.toString());
  }
}

2

যদি আপনি অবজেক্ট ক্লাসের দিকে তাকান (জাভাতে সমস্ত শ্রেণীর পিতামাতা বর্গ) toString () পদ্ধতি বাস্তবায়ন হয় implementation

    public String toString() {
       return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

আপনি যখনই জাভাতে কোনও বস্তু মুদ্রণ করবেন তখন টুস্ট্রিং () কল হবে। এখন আপনি যদি স্ট্রিং () -কে ওভাররাইড করেন তবে আপনার পদ্ধতিটি অন্য অবজেক্ট শ্রেণি পদ্ধতি কলকে কল করবে।

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