জাভা কোনও এনক্লোজিং ক্লাস নয়


366

আমি একটি টেট্রিস গেমটি তৈরি করার চেষ্টা করছি এবং সংকলক ত্রুটি পাচ্ছি

Shape is not an enclosing class

যখন আমি একটি অবজেক্ট তৈরি করার চেষ্টা করি

public class Test {
    public static void main(String[] args) {
        Shape s = new Shapes.ZShape();
    }
}

আমি প্রতিটি আকৃতির জন্য অভ্যন্তর ক্লাস ব্যবহার করছি। এখানে আমার কোড অংশ

public class Shapes {
    class AShape {
    }
    class ZShape {
    }
}

আমি কি ভুল করছি ?


160
new Shape().new ZShape();। ক্লাসটি ZShapeতাত্ক্ষণিকভাবে চালিত করার জন্য একটি সংযুক্তকরণের প্রয়োজন।
সোটিরিওস ডেলিমনোলিস

4
অভ্যন্তরীণ ক্লাসটি পৃথক ফাইলে
সরান

এই ক্ষেত্রে @ ডিম্মদুহ মন্তব্যটি উত্তর হওয়া উচিত। তাদের অভ্যন্তর শ্রেণি হওয়া উচিত নয়। তাদের সরানো শেপ শ্রেণীর সাথে থাকা অন্যান্য সমস্যাগুলি সনাক্ত করে।
যেরেমিয়া অ্যাডামস

এখানে প্রশ্নের উত্তর দেওয়ার জন্য নয় তবে আমি এখানে উত্তরাধিকারটি কোথায় AShapeএবং ZShapeবেস ক্লাসটি প্রসারিত করার জন্য পরামর্শ দিতে পারি Shapes। বাসা বাঁধার ক্লাসগুলি এই সমস্যার জন্য খুব ভাল ডিজাইন নয়।
পরমবীর সিং কারওয়াল

উত্তর:


492

ZShape স্থির নয় তাই এর জন্য বাইরের শ্রেণীর উদাহরণ প্রয়োজন।

সবচেয়ে সহজ সমাধানটি staticযদি আপনি পারেন তবে জেড শেপ এবং কোনও নেস্টেড ক্লাস তৈরি করা ।

আমি কোনও ক্ষেত্রও তৈরি করতাম finalবা আপনিও static finalপারেন।


13
মেকিং ZShape staticতিনি কী করতে চাইছেন তার উদ্দেশ্যটিকে পুরোপুরি পরাভূত করে, যা এর অনুলিপি তৈরি করে ZShape
কার্ডানো

17
@ কার্ডানো staticএটি সহজতর করে তোলে, কঠিন নয়।
পিটার ল্যারি

12
অন্য সহজ সমাধান পরিক্ষেপ বর্গ instantiate ভেতরের বর্গ, অর্থাত ZShape এই ভাবে পেয়ে করা: ZShape myShape = new Shape().instantiateZShape();। এটি ইঙ্গিত দেয় যে আপনি যে জেড শেপ পাবেন সেটি কোনও শেপ ছাড়া অস্তিত্ব রাখে না, যা এখানে উদ্দেশ্য।
ভিনস

@ পিটার লরে আপনি কীভাবে বুঝতে পেরেছিলেন যে সমস্ত শেপের দৃষ্টান্তগুলিতে একই জেড শেপ ব্যবহার করতে হবে? আমি তার উত্স থেকে এটি পাই না।
অবিশ্বাস্য জানুয়ারী

2
আমরা স্থিতিশীল বা উদাহরণ চাইলে 2 টি কেস রয়েছে। এটি স্থির করা সর্বদা সাহায্য করবে না।
যোগেশ চুহান

177

ধরুন খুচরা বিক্রেতাপ্রোফাইল মডেলটি আপনার প্রধান শ্রেণি এবং খুচরা বিক্রেতা পেমেন্টমোডেল এটির অভ্যন্তরীণ শ্রেণি। আপনি ক্লাসের বাইরে ইনার ক্লাসের একটি বিষয় নিম্নরূপ তৈরি করতে পারেন:

RetailerProfileModel.RetailerPaymentModel paymentModel
        = new RetailerProfileModel().new RetailerPaymentModel();

34
এই উত্তরটি সত্যিই সহায়ক ছিল, আমি কখনই জানতাম না যে আপনি পরপর দুবার নতুন কল করতে পারবেন (এবং আমি 8+ বছর ধরে জাভা করেছি!)
PaulBGD

1
আপনি যখনই সেই অবজেক্টের রেফারেন্স রাখতে না চান ততক্ষণ আপনি অবশ্যই নতুন অপারেটরটিকে যেকোন বার কল করতে পারবেন।
বিশাল কুমার

1
যদি অভ্যন্তরীণ শ্রেণীর কোনও বস্তু এইভাবে তৈরি করা হয়, তবে এটি কীভাবে বাইরের শ্রেণীর সদস্যদের অ্যাক্সেস করতে পারে?
জিংং হুয়াং

1
অভ্যন্তর শ্রেণীর মধ্যেই আপনি আউটারক্লাস.এটি ব্যবহার করতে পারেন I আমি মনে করি না যদিও অভ্যন্তর শ্রেণীর কোডের বাইরে থেকে উদাহরণ পাওয়ার কোনও উপায় আছে। অবশ্যই, আপনি সর্বদা আপনার নিজস্ব সম্পত্তি পরিচয় করিয়ে দিতে পারেন: পাবলিক আউটারক্লাস getOuter () {ফিরিয়ে দিন OuterClass.this; }
বিশাল কুমার

পরীক্ষাগুলির জন্য কাজ করে:underTest = Mockito.mock(Outer.class).new InnerNonStaticClass();
27:38

48

আমি যা পরামর্শ দেব তা অ স্থির শ্রেণিকে স্ট্যাটিক শ্রেণিতে রূপান্তর করা নয় কারণ সেক্ষেত্রে আপনার অভ্যন্তর শ্রেণি বহিরাগত শ্রেণির অ স্থিতিশীল সদস্যদের অ্যাক্সেস করতে পারে না।

উদাহরণ:

class Outer
{
    class Inner
    {
        //...
    }
}

সুতরাং, এই জাতীয় ক্ষেত্রে, আপনি যেমন কিছু করতে পারেন:

Outer o = new Outer();
Outer.Inner obj = o.new Inner();

আউটার সম্পর্কে কী। ইনার আপজ = (নতুন আউটার)। নতুন ইনার ();
হুসেন কেএমআর বেহেস্তি

1
@ হুসেইন কেএমআর বিহেস্টি, এমন কোনও বিষয় যা নিশ্চিতভাবে কাজ করে না। যাইহোক, এটি কাজ করবেOuter.Inner obj = new Outer().new Inner();
অমিত উপাধ্যায়

তবে অমিত, এটি আমার পক্ষে কাজ করে। আমি কেন খুশি হব যদি আপনি ব্যাখ্যা করতে পারেন যে এটি কেন কাজ করা উচিত নয়।
হুসেন কেএমআর বেশেটি

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

1
ওহ, আমার খারাপ, এটি টাইপো ছিল, আউটার.ইনার ইনজেক্ট = (নতুন আউটার ())। নতুন ইনার (); আশা করি এবার ঠিক আছে এবং লক্ষ্য করার জন্য ধন্যবাদ।
হুসেন কেএমআর বেহেস্তি

18

দস্তাবেজে যেমন বলা হয়েছে :

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

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

ধন্যবাদ! শুরু হতে যাচ্ছে.
ব্রেনান মিলার

10

কখনও কখনও, আমাদের একটি অভ্যন্তর শ্রেণীর একটি নতুন উদাহরণ তৈরি করতে হবে যা স্থির হতে পারে না কারণ এটি পিতাম শ্রেণীর কিছু বৈশ্বিক পরিবর্তনশীলগুলির উপর নির্ভর করে। এই পরিস্থিতিতে, আপনি যদি স্থির নয় এমন কোনও অভ্যন্তর শ্রেণীর উদাহরণ তৈরি করার চেষ্টা করেন, একটি not an enclosing classত্রুটি নিক্ষেপ করা হয়।

প্রশ্নের উদাহরণস্বরূপ, ZShapeস্ট্যাটিক না হতে পারে কারণ এটির Shapeক্লাসে বৈশ্বিক চলক প্রয়োজন ?

আপনি কিভাবে নতুন উদাহরণ তৈরি করতে পারেন ZShape? এই হল কিভাবে:

অভিভাবক শ্রেণিতে একটি গিটার যুক্ত করুন:

public ZShape getNewZShape() {
    return new ZShape();
}

এটিতে এটি অ্যাক্সেস করুন:

Shape ss = new Shape();
ZShape s = ss.getNewZShape();


1

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

public class Shape {

    private String shape;

    public ZShape zShpae;
    public SShape sShape;

    public Shape(){
      int[][] coords =  noShapeCoords;
      shape = "NoShape";
      zShape = new ZShape();
      sShape = new SShape();
    }

    class ZShape{
      int[][] coords =  zShapeCoords;
      String shape = "ZShape";
    }

    class SShape{
      int[][] coords = sShapeCoords;
      String shape = "SShape";
    }

 //etc
}

তারপরে আপনি নতুন শেপ () করতে পারেন; এবং শেপ.জ্যাশপের মাধ্যমে জেড শেপ দেখুন;


1
একটি ভুল সমাধান। যৌক্তিক ত্রুটি। যদি অভ্যন্তর শ্রেণীর (যেমন জেড শেপ) কোনও ক্ষেত্র সেট করার প্রয়োজন হয় তবে বহিরাগত শ্রেণীর নির্মাতায় আপনাকে অবশ্যই এটি পেতে হবে! পাবলিক শেপ (স্ট্রিং ফিল্ড 1_ইনারক্লাস, ইনট ফিল্ড 2_ইনারক্লাস ...) {zShape = নতুন জেড শেপ (স্ট্রিং ফিল্ড 1_ইনারক্লাস, ইনট ফিল্ড 2_ ইনারক্লাস ...) ...}}
মোহসেন

1

নেস্টেড শ্রেণিকে স্থির হিসাবে তৈরি করার দরকার নেই তবে এটি অবশ্যই সর্বজনীন হতে হবে

public class Test {
    public static void main(String[] args) {
        Shape shape = new Shape();
        Shape s = shape.new Shape.ZShape();
    }
}

1

গ্রহণযোগ্য উত্তরটি পড়ার সময় আমি প্রথমে একটি জিনিসটি বুঝতে পারি নি যে অভ্যন্তরীণ শ্রেণীর স্ট্যাটিক তৈরি করা মূলত এটি তার নিজস্ব পৃথক শ্রেণিতে স্থানান্তরিত করার মতোই।

এইভাবে, ত্রুটি পাওয়ার সময়

এক্সএক্সএক্স কোনও সংলগ্ন শ্রেণি নয়

আপনি এটি নিম্নলিখিত যে কোনও উপায়ে সমাধান করতে পারেন:

  • যুক্ত করুন staticঅভ্যন্তর শ্রেণিতে কীওয়ার্ড যুক্ত , বা
  • এটিকে তার নিজস্ব পৃথক শ্রেণিতে সরিয়ে দিন।

1

যদি অভিভাবক শ্রেণি সিঙ্গেলটন নিম্নলিখিত উপায় ব্যবহার করে:

Parent.Child childObject = (Parent.getInstance()).new Child();

যেখানে getInstance()প্যারেন্ট ক্লাস সিঙ্গলটন অবজেক্ট আসবে।


0

প্রশ্ন থেকে প্রয়োজনীয়তা অর্জনের জন্য, আমরা ইন্টারফেসে ক্লাস স্থাপন করতে পারি:

public interface Shapes {
    class AShape{
    }
    class ZShape{
    }
}

এবং তারপরে লেখক হিসাবে আগে ব্যবহার করার চেষ্টা করুন:

public class Test {
    public static void main(String[] args) {
        Shape s = new Shapes.ZShape();
    }
}

আমরা যদি সঠিক "যৌক্তিক" সমাধানটি সন্ধান করি তবে fabricডিজাইনের ধরণটি ব্যবহার করা উচিত

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