জাভা সমর্থন করে?


95

জাভাতে কি সি ++ এর এনালগ রয়েছে struct:

struct Member {
  string FirstName; 
  string LastName;  
  int BirthYear; 
};

আমার নিজের ডেটা টাইপ ব্যবহার করা দরকার।


যারা খুব আক্ষরিক অনুলিপি করছেন তাদের জন্য: জাভাতে ক্ষেত্রগুলিতে সত্যিকার অর্থে একটি ছোট হাতের অক্ষর দিয়ে শুরু করা দরকার firstName, lastNameএবং birthYear(অথবা yearOfBirthঅবশ্যই)।
মার্টেন বোদেউয়েস

উত্তর:


52

জাভা অবশ্যই কোনও স্ট্রাক্ট নেই :) তবে আপনি এখানে যা বর্ণনা করেছেন তা জাভাবিয়ান শ্রেণির মতো দেখাচ্ছে।


31
ঠিক আছে, কেবলমাত্র সার্বজনীন ভেরিয়েবলগুলি সহ একটি শ্রেণি স্ট্যাকের মতো ভয়ঙ্কর দেখাচ্ছে।
মিগ্লাচে

10
জাভা 14 এ উত্তর দেওয়ার 9 বছর পরে আমাদের রেকর্ড থাকবে time
জর্জ লেইং

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

একটি শিমের বৈশিষ্ট্য রয়েছে (অর্থাত্ নিয়ামক এবং সাধারণত সেটার) এবং আজকাল সাধারণত এটি শিমের প্রয়োজনীয়তা মেনে চলার জন্য টীকায়িত হয়।
মার্টেন বোদেউয়েস 3:53

89

জাভাতে একটি কাঠামোর সমতুল্য হবে

class Member
{
    public String FirstName; 
    public String LastName;  
    public int    BirthYear; 
 };

এবং সঠিক পরিস্থিতিতে এর সাথে কোনও ভুল নেই। C ++ এর মতো অনেকটাই আপনি কখন স্ট্রাক্ট আয়াত ব্যবহার করেন কখন আপনি এনক্যাপসুলেটেড ডেটা সহ কোনও শ্রেণি ব্যবহার করেন।


22
আমি সি ++ তে যেমন পরিস্থিতিতে জাভাতে "POD" টাইপ ক্লাস ব্যবহার করব। "মান অবজেক্টস" বসন্ত J2EE মনে রাখবেন যেখানে আপনার কাছে এমন একটি পদ্ধতি রয়েছে যা একবারে একাধিক মান ফিরিয়ে দেয়। গেটর এবং সেটার পদ্ধতির সাহায্যে ডেটা এনক্যাপুলেটেজে কোনও লাভ নেই, কেবল ক্ষেত্রগুলি সর্বজনীন - খাটো এবং আরও বর্ণনামূলক করুন। যে কোনও "যথাযথ" আমি ঝর্ণা প্রবণতা করি, একইভাবে আমি সি ++ তেও করতাম do সুতরাং আমি আমার মূল মন্তব্যে দাঁড়িয়ে আছি তবে এটি একটি স্টাইল পছন্দ। আমি মনে করি না যে আপনি কোনও কিছু শিথিল করেছেন এবং সত্যই আমি মনে করি এটি আরও বর্ণনামূলক যখন আপনি যা পেয়েছেন তা একটি মান শ্রেণি।
টম কোয়ারেন্ডন

16
সেমিকোলন দিয়ে জাভাতে কোনও ক্লাস শেষ করার দরকার নেই।
শেফ ফেরাউন

15
আমি ভুল হলে আমাকে সংশোধন করুন, তবে স্ট্রাক্টের বিষয়টি হ'ল এটি রেফারেন্স দ্বারা নয় মান দিয়ে পাস হয়েছে। ক্লাস সবসময় রেফারেন্স দ্বারা পাস করা হয়। এই কারণেই এই উত্তরটি ভুল।
ULazdins

4
@ গুলাজিন্স: আমি মনে করি আপনি সি + স্ট্র্টকে সি ++ স্ট্রাক্টের সাথে বিভ্রান্ত করছেন। আপনি যখন C ++ এর কোনও পদ্ধতিতে কোনও ক্লাস পাস করেন, তখন এটি অনুলিপি নির্মাণকারীকে কল করে, যা ডিফল্টরূপে প্রতিটি ক্ষেত্রের অনুলিপি করে। রেফারেন্সের মাধ্যমে এটি পাস করার জন্য আপনাকে সিনট্যাক্সটি স্পষ্টভাবে ব্যবহার করতে হবে।
রোনালদো নাজারিয়া

4
@ পাবলোআরিয়েল আমিও আমার আগের মন্তব্যের সাথে একমত নই। আমার চিন্তাভাবনাটি 7 বছরেরও বেশি সময় ধরে বিকশিত হওয়ার অনুমতি রয়েছে;)
মাইকেল বেরি

16

আসলে সি ++ এর একটি কাঠামো একটি শ্রেণি (যেমন আপনি সেখানে পদ্ধতিগুলি সংজ্ঞায়িত করতে পারেন, এটি প্রসারিত হতে পারে, এটি একটি শ্রেণীর মতো কাজ করে), পার্থক্য কেবলমাত্র ততটাই হ'ল ডিফল্ট অ্যাক্সেস মোডফায়ারগুলি পাবলিকের জন্য সেট করা হয় (শ্রেণীর জন্য তারা ব্যক্তিগততে সেট করা থাকে) গতানুগতিক).

এটি সত্যই সি ++ এর মধ্যে একমাত্র পার্থক্য, অনেক লোক তা জানেন না। ; )


15

জাভাতে সি ++ এর স্ট্রাক্টগুলির সাথে কোনও অ্যানালগ নেই, তবে আপনি সমস্ত পাবলিক সদস্যের সাথে ক্লাস ব্যবহার করতে পারেন।


15
বাস্তবিক একটি structC ++ (হয় প্রায় কাছাকাছি ) একটি একই জিনিস classC ++।
জোয়াকিম সৌর

পছন্দ করুন এটি আমাকে বিস্মিত করে তোলে যে সি স্ট্রাক্ট থেকে কতগুলি পৃথক সি ++ ক্লাস ।
জফফ

@ মার্টেনবোডওয়েস সমস্যাটি internalহ'ল এটির চেয়ে কম দৃশ্যমান protected। একটি internalসদস্য ঘোষণা com.myapp.libপ্রবেশযোগ্য হবে না com.myapp.main, তাই আপনি একই প্রকল্পের মধ্যে সর্বত্র এটি অ্যাক্সেস করতে সক্ষম নাও হতে পারে।
জফফ

@ জেপফ: আমি কোনও সি বা সি ++ বিশেষজ্ঞ নই, এটি কেবল আকর্ষণীয় ট্রিভিয়ার একটি র্যান্ডম টুকরো যা আমি তুলেছিলাম। তবে আমি অনুমান করি যেহেতু সি ++ ক্লাসগুলি প্রায় সি ++ স্ট্রাক্টের সমান, তাই আমি অনুমান করি যে তারা উভয়ই সি স্ট্রাক্টের থেকে একেবারেই আলাদা (যা সরাসরি সম্পর্কিত কনস্ট্রাক্টর / পদ্ধতিগুলির উত্তরাধিকারকে সমর্থন করে না)।
জোছিম সাউর

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

10

জাভা 14 রেকর্ডগুলির জন্য সমর্থন যুক্ত করেছে, যা কাঠামোগত ডেটা ধরণের যা নির্মাণ করা খুব সহজ।

আপনি জাভা রেকর্ডটি এভাবে প্রকাশ করতে পারেন:

public record AuditInfo(
    LocalDateTime createdOn,
    String createdBy,
    LocalDateTime updatedOn,
    String updatedBy
) {}
 
public record PostInfo(
    Long id,
    String title,
    AuditInfo auditInfo
) {}

এবং, জাভা সংকলক AuditInfoরেকর্ডের সাথে সম্পর্কিত নিম্নলিখিত জাভা শ্রেণি তৈরি করবে :

public final class PostInfo
        extends java.lang.Record {
    private final java.lang.Long id;
    private final java.lang.String title;
    private final AuditInfo auditInfo;
 
    public PostInfo(
            java.lang.Long id,
            java.lang.String title,
            AuditInfo auditInfo) {
        /* compiled code */
    }
 
    public java.lang.String toString() { /* compiled code */ }
 
    public final int hashCode() { /* compiled code */ }
 
    public final boolean equals(java.lang.Object o) { /* compiled code */ }
 
    public java.lang.Long id() { /* compiled code */ }
 
    public java.lang.String title() { /* compiled code */ }
 
    public AuditInfo auditInfo() { /* compiled code */ }
}
 
public final class AuditInfo
        extends java.lang.Record {
    private final java.time.LocalDateTime createdOn;
    private final java.lang.String createdBy;
    private final java.time.LocalDateTime updatedOn;
    private final java.lang.String updatedBy;
 
    public AuditInfo(
            java.time.LocalDateTime createdOn,
            java.lang.String createdBy,
            java.time.LocalDateTime updatedOn,
            java.lang.String updatedBy) {
        /* compiled code */
    }
 
    public java.lang.String toString() { /* compiled code */ }
 
    public final int hashCode() { /* compiled code */ }
 
    public final boolean equals(java.lang.Object o) { /* compiled code */ }
 
    public java.time.LocalDateTime createdOn() { /* compiled code */ }
 
    public java.lang.String createdBy() { /* compiled code */ }
 
    public java.time.LocalDateTime updatedOn() { /* compiled code */ }
 
    public java.lang.String updatedBy() { /* compiled code */ }
}

লক্ষ করুন যে, কন্সট্রাকটর, অ্যাকসেসর পদ্ধতি, সেইসাথে equals, hashCodeএবং toString, আপনার জন্য তৈরি করা হয়, তাই এটি খুব জাভা রেকর্ডস ব্যবহার করতে সুবিধাজনক।

একটি জাভা রেকর্ড অন্য জাভা অবজেক্টের মতো তৈরি করা যেতে পারে:

PostInfo postInfo = new PostInfo(
    1L,
    "High-Performance Java Persistence",
    new AuditInfo(
        LocalDateTime.of(2016, 11, 2, 12, 0, 0),
        "Vlad Mihalcea",
        LocalDateTime.now(),
        "Vlad Mihalcea"
    )
);

আপনি কীভাবে জাভা রেকর্ডগুলি কাস্টমাইজ করতে পারবেন সে সম্পর্কে আরও তথ্যের জন্য এই নিবন্ধটি দেখুন


8

প্রজেক্ট জুনিয়নের সাথে আপনি জাভাতে স্ট্রাক্ট ব্যবহার করতে পারেন @ স্ট্রোক টীকা সহ একটি ক্লাস টিকা দিয়ে

@Struct
class Member {
  string FirstName; 
  string LastName;  
  int BirthYear; 
}

প্রকল্পের ওয়েবসাইটে আরও তথ্য: https://tehleo.github.io/junion/


ভাল জিনিস. আমি এখন বুঝতে পারি যে স্ট্রাকচারগুলি (অবজেক্টস) মেমরিতে কীভাবে উপস্থাপিত হয়। ধন্যবাদ মানুষ :)
ব্যবহারকার 218046

7

হ্যাঁ, জাভাতে এখনও স্ট্রাক্ট / মান টাইপ নেই। তবে জাভা আসন্ন সংস্করণে আমরা যাচ্ছি inline classযা সি # তে কাঠামোর অনুরূপ এবং আমাদের বরাদ্দ ফ্রি কোড লিখতে সহায়তা করবে।


inline class point { 
  int x;
  int y;
}


যে এটাকে হ্রাস করেছে, আমি জানি কেন? আপনি Java ইনলাইন বর্গ এখানে সম্বন্ধে আরও পড়তে পারেন infoq.com/articles/inline-classes-java
ganesan অরুনাচলম

6

হ্যাঁ, একটি শ্রেণি যা আপনার প্রয়োজন। একটি শ্রেণি একটি নিজস্ব ধরণ নির্ধারণ করে।


2

"সত্যই" খাঁটি স্ট্রোক জাভাতে সমর্থিত নয়। উদাহরণস্বরূপ, সি # structএমন সংজ্ঞাগুলি সমর্থন করে যা মানগুলি উপস্থাপন করে এবং যে কোনও সময় বরাদ্দ করা যেতে পারে।

জাভাতে, সি ++ স্ট্রাক্টগুলির একটি অনুমিতকরণের অনন্য উপায়

struct Token
{
    TokenType type;
    Stringp stringValue;
    double mathValue;
}

// Instantiation

{
    Token t = new Token;
}

(স্ট্যাটিক বাফার বা তালিকা) ব্যবহার না করে এমন কিছু করছে

var type = /* TokenType */ ;
var stringValue = /* String */ ;
var mathValue = /* double */ ;

সুতরাং, কেবল ভেরিয়েবলগুলি বরাদ্দ করুন বা স্ট্যাটিকালি তাদের একটি শ্রেণিতে সংজ্ঞায়িত করুন।


জাভা সমর্থন করে না var, তাই না?
জফফ

0

জাভা 14 এর পাশাপাশি এটি রেকর্ড সমর্থন করে। আপনি যে https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Record.html পরীক্ষা করতে চাইতে পারেন

public record Person (String name, String address) {}

Person person = new Person("Esteban", "Stormhaven, Tamriel");

এবং জাভা 15 এর পরে সিলযুক্ত ক্লাস রয়েছে htt https://openjdk.java.net/jeps/360

sealed interface Shape permits Circle, Rectangle {

  record Circle(Point center, int radius) implements Shape { }

  record Rectangle(Point lowerLeft, Point upperRight) implements Shape { } 
}

এমন কোনও উপায়ে কি আপনি কোনও রেকর্ডের উদাহরণ দিতে পারেন?
স্ক্র্যাটে

দয়া করে উত্তর হিসাবে কোনও সরঞ্জাম বা লাইব্রেরি পোস্ট করবেন না। এটি অন্তত উত্তরে নিজেই কীভাবে সমস্যাটি সমাধান করে তা প্রদর্শন করুন ।
ইয়াতিন

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