Statyczna metoda kopiująca i java.lang.StackOverflowError

0

Witam

Może mi ktos wytłumaczyć, dlaczego statyczna metoda kopiująca powoduje wyjątek StackOverflowError

class Person {
	private String name;
	private String username;
	
	public Person() {}
	
	public Person(String name, String username) {
		this.name = name;
		this.username = username;
	}
	@Override public boolean equals(Object o) {
		if(o==this) return true;
		if(!(o instanceof Person)) return false;
		Person p = (Person)o;
		return p.name == name && p.username == username;
	}
	@Override public int hashCode() {
		int result = 17;
		result = 31*result+name.hashCode();
		result = 31*result+username.hashCode();
		return result;
		
	}
	public static Person newInstance(Person p) {
		return Person.newInstance(p);
	}
}


public class Test {
	public static void main(String[] args) {
		Person p1 = new Person("Jan", "Nowak");
		Person p2 = new Person("Anna", "Nowak");
		Person p3 = new Person("Anna", "Nowak");
		System.out.println("p1.equals(p2) "+p1.equals(p2));
		System.out.println("p2.equals(p3) "+p2.equals(p3));
		Person p4 = p1.newInstance(p1);
		System.out.println("p2.equals(p1)"+p2.equals(p1));
	}

	
}
0

Przecież tu

        public static Person newInstance(Person p) {
                return Person.newInstance(p);

masz nieskończoną rekurencję.

0

Dzięki za odpowiedź, choć nie bardzo kumam co powoduje "nieskończoną rekurencję" :-/
No i jak coś podobnego wykorzystać do kopiowanie obiektu bez Cloneable.

0

Naprawdę nie kumasz? Z metody newInstance() wywołujesz metodę newInstance().

0

Ahh oczywiste [wstyd]
Ale przeprowadzić kopiowanie obiektu z użyciem statycznej metody?, lub jakiegoś konstruktora kopiującego.
Może ktoś podać jakiś przykład?

0
class Person implements Cloneable {
    private String name;
    private String username;
    
    public Person() {}
    
    public Person(String name, String username) {
            this.name = name;
            this.username = username;
    }
    @Override public boolean equals(Object o) {
            if(o==this) return true;
            if(!(o instanceof Person)) return false;
            Person p = (Person)o;
            return p.name == name && p.username == username;
    }
    @Override public int hashCode() {
            int result = 17;
            result = 31*result+name.hashCode();
            result = 31*result+username.hashCode();
            return result;
    }
    
    /**
     * {@inheritDoc}
     */
    @Override
    public Person clone() throws CloneNotSupportedException {
        return (Person) super.clone();
    }
}
Person p = new Person("Jan", "Kowalski");
Person pCopy = p.clone();
System.out.println(p.equals(pCopy));
0

@pustak, autor postu napisał

No i jak coś podobnego wykorzystać do kopiowanie obiektu bez Cloneable.

class Person {
        private String name;
        private String username;
       
        public Person() {}
       
        public Person(String name, String username) {
                this.name = name;
                this.username = username;
        }
        public Person(Person p) {
                this.name = p.name;
                this.username = p.username;
        }
        @Override public boolean equals(Object o) {
                if(o==this) return true;
                if(!(o instanceof Person)) return false;
                Person p = (Person)o;
                return p.name == name && p.username == username;
        }
        @Override public int hashCode() {
                int result = 17;
                result = 31*result+name.hashCode();
                result = 31*result+username.hashCode();
                return result;

        }
}


public class Test {
        public static void main(String[] args) {
                Person p1 = new Person("Jan", "Nowak");
                Person p2 = new Person("Anna", "Nowak");
                Person p3 = new Person("Anna", "Nowak");
                System.out.println("p1.equals(p2) "+p1.equals(p2));
                System.out.println("p2.equals(p3) "+p2.equals(p3));
                Person p4 = new Person(p1);
                System.out.println("p4.equals(p1) "+p2.equals(p1));
        }


}
0

Dzięki za wyjaśnienie.
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1