Cum pot crea un obiect din această clasă?

În clasa B , cum pot crea un obiect de clasă A altul decât procesul de creare a obiectelor (adică fără a crea un obiect având null ?

class A
  {
    public int one;  
   A(A a)
    {
      a.one=1;
    }
  }
class B
  {
   public static void main(String...args)
     {
     //now how to create an object of class A over here.
     }
  }
0
Aceasta nu este o întrebare la domiciliu. Am avut un gând în mintea mea despre această întrebare. Cu siguranță nu poate fi editabil.
adăugat autor Ice Box, sursa
@ Emmad mulțumiri pentru ur comentariu, dar în java acest lucru se poate face cu ușurință
adăugat autor Ice Box, sursa
Ce context? Este o întrebare de acasă? Întrebare interviu? Este A editabil?
adăugat autor Hovercraft Full Of Eels, sursa

6 răspunsuri

Dacă A este sigilată (nu poate fi editată), puteți extinde această clasă și puteți da aceluia un constructor implicit pentru al trece într-o nouă instanță a lui A. Nu există altă soluție fără a modifica codul sursă al lui A.

0
adăugat
Ai dreptate. Deci nu văd o cale de a rezolva această problemă.
adăugat autor Florian Salihovic, sursa
Cred că A nu poate fi extinsă. Constructorul în această formă aruncă NullPointerException și constructorul implicit este blocat/nu există.
adăugat autor Pshemo, sursa

Dacă înțeleg corect întrebarea dvs., doriți să creați un obiect a fără a trebui să îl transmiteți unui obiect preexistent de același tip.

Pentru a face acest lucru, trebuie să adăugați un constructor la clasa A care nu ia un parametru de tip A sau să modifice unul existent:

class A
    {
        A() {
           //Constructor logic.
        }
        A(A a) {
           //Constructor logic when passing an existing object of the same type, perhaps to create a clone.
        }
    }

Dacă din anumite motive nu puteți modifica clasa A, va trebui să urmați răspunsul lui Mark Byers și să transmiteți o referință nulă constructorului.


Actualizare

Odată cu actualizarea codului, această problemă (sau experimentul gândit) este insolvabilă: clasa A nu poate fi instanțiată așa cum este scrisă.

0
adăugat
constructorul implicit nu este intenționat acolo.
adăugat autor Ice Box, sursa
bine mulțumesc pentru răspuns ur
adăugat autor Ice Box, sursa

Singura modalitate de a crea un obiect este să-i dați un alt obiect A în constructor, dar acel obiect A trebuie, de asemenea, să aibă un alt obiect A în constructor. Acest lucru se va opri numai când introduceți referință null în constructor.

Editați | ×

Răspunsul meu sa bazat pe versiunea anterioară de cod. Acum nu puteți crea obiect, deoarece nu puteți pune null în constructor (nu trebuie să aibă câmpul one ). Dacă doriți să creați un obiect, trebuie să faceți un test pentru null în constructor, precum dacă (a! = Null) {a.one = 1;} și să treceți null sau deja creat un obiect în constructor .

0
adăugat
dar dacă am trece o nulă în orice moment, atunci constructorul va arunca cu siguranță o excepție pointer nul.
adăugat autor Ice Box, sursa

Nu puteți instanța A în exemplul dvs. Este o problema de pui si oua. Aveți nevoie de o instanță a lui A pentru a crea o instanță a lui A, dar nu puteți crea o instanță a lui A fără a avea o instanță a lui A.

Deci, fără modificări la A (fie adăugând o verificare "null", fie adăugând un constructor implicit), nu puteți crea o instanță a lui A în acest scenariu.

0
adăugat

Pentru a construi un obiect de tip A, trebuie să treceți la constructor fie o referință la un alt obiect de tip A, fie altceva referința nul. Deci, aveți doar două opțiuni:

A a1 = new A(null);
A a2 = new A(a1);

Prima dată când creați un obiect de tip A , trebuie să utilizați referința nulă deoarece nu aveți alte obiecte de tip A .


Actualizare

După ce ați schimbat întrebarea dvs., nu cred că este posibil să construiți un obiect de tip A .

0
adăugat
Aceasta va arunca NullPointerException . Când spicify A a1 = nou A (null) , atunci în constructor, a.one = 1 va arunca NPE .
adăugat autor Priyank Doshi, sursa
@saurabh Puteți folosi pur și simplu a.propertyName în constructor ca în mod normal, dar va trebui să verificați dacă a este null primul. Dacă nu puteți modifica codul de clasă A , această verificare ar trebui să fie deja în vigoare. Dacă nu este, atunci pun la îndoială utilitatea clasei.
adăugat autor Lilienthal, sursa
da aceasta ar putea fi făcută, dar nu este, mai mult sau mai puțin aceeași metodă folosită mai sus.
adăugat autor Ice Box, sursa
wat dacă vreau să fac ceva cu proprietățile obiectului în constructor.
adăugat autor Ice Box, sursa
@ Priyank soluția dată de Mark a fost conform versiunii anterioare a codului. Marcajul nu era conștient de funcționalitatea actuală a constructorului în timp ce scria codul A a1 = nou A (nulă);
adăugat autor Ice Box, sursa

În mod normal nu puteți face acest lucru în Java.

Cu toate acestea, este posibil cu înșelăciuni grele. Nu face acest lucru în codul de producție. Dar din motive de argument:

1) Cu Mockito (dar nu va funcționa cu un manager de securitate):

import org.mockito.Mockito;

class B {

    public static void main(String... args) {
        A mockedA = Mockito.mock(A.class);
        A realA = new A(mockedA);
        System.out.println(realA);
    }
}

2) Iată un alt mod de a face acest lucru cu prioritate finalize() .

0
adăugat
@ Arend v. Reinersdorff mulțumiri pentru soluție.
adăugat autor Ice Box, sursa
+1: pentru a gândi în afara casetei și pentru a posta un link foarte relevant. Nu sunt sigur dacă OP-ul caută un astfel de tip de soluție, dar, totuși, foarte interesant și educativ!
adăugat autor Mark Byers, sursa