자바

2016-08-04 3 views
1

내가 메인 클래스와 주요 방법을 다음 한 한 단계에서 각각 다른 두 개체를 전달자바

class Tom extends Enemy { 

    Enemy peter; 

    Tom(Main main) { 
     this.peter = main.peter; 
    } 
} 

class Peter extends Enemy { 

    Enemy tom; 

    Peter(Main main) { 
     this.tom = main.tom; 
    } 
} 

주 메서드에서 두 가지 인쇄 메서드를 실행하면 첫 번째 메서드는 톰이 creat이 아니기 때문에 null을 반환합니다. 그때 그것은 Enemy tom에 할당됩니다. 이 문제를 해결하기 위해 TomPeter을 생성자의 Enemy에 할당하지 않고 두 개체를 만든 후에 메서드를 할당했습니다. 그래서 더이 같은 는 :

메소드가 println 메소드 방법 전에 호출됩니다
private void setEnemies(){ 
    peter.tom = tom; 
    tom.peter = peter; 
} 

, 그것은 완벽하게 작동합니다. 내 질문은 : 개체를 만든 후 별도의 메서드를 호출 할 필요가 없도록 개체 생성시 적을 설정하는 방법이 있습니까?

+1

주,'* 안전하지 않은 출판 *의 예입니다 : 당신은 'Main'이 완전히 초기화되기 전에'Main' 참조를'Peter'의 생성자에 전달하고 있습니다. 이것은'Peter '가 유효한 상태에 있기 전에'Main'을 사용하여 작업을 시작할 수 있다는 것을 의미합니다. 예기치 못한 예측 불가능한 결과가 발생할 수 있습니다. –

+0

저는 현재 프로젝트에서 다른 클래스의 생성자로부터'Peter'와'Tom'을 만듭니다. 코드를 단순화하기 위해이 방법으로 게시했습니다. –

+0

'RadioButton'에 단일 RadioButtonGroup을 추가하여 동일한 작업을 공장에 추가했습니다. 그런 다음 RadioButtonGroup은 모든 라디오 버튼이 서로 관련되도록합니다. –

답변

6

짧은 대답은 : 아니오, 할 수 없습니다. 그 이유는 한 번에 하나씩이 인스턴스를 만들어야하기 때문입니다. 첫 번째 것을 만들면 두 번째 것은 아직 존재하지 않으므로 첫 번째 것에 전달할 수 없습니다.

끔찍한 제한 사항이 아닙니다. Enemy 클래스에 void setEnemy(Enemy myEnemy) 메서드를 추가하고 각각의 적을 호출하려고합니다. 다음과 같은 내용이 있습니다 :

Enemy peter = new Peter(); 
Enemy tom = new Tom(); 
peter.setEnemy(tom); 
tom.setEnemy(peter); 
1

오브젝트 (Peter와 Tom)를 차례로 생성하므로 오브젝트 작성시 설정할 수 없습니다. 그리고 첫 번째 것을 만들 때 두 번째 것은 아직도 인스턴스화되지 않습니다. 이렇게하면 아직 생성되지 않은 두 번째 것을 첫 번째 것에 전달할 수 없습니다. 적 (Enemy peter = new Peter(); 그것은 피터 오브젝트의 다른 인스턴스가 될 것이므로 여전히 원하는 것은 아닙니다.

1

일반적으로 아직 존재하지 않는 오브젝트를 참조하는 것은 아직 평가되지 않은 기능에서만 수행 할 수 있습니다. 여기 자바 8 도움을 올 수 있습니다.

Enemy peter = new Enemy(() -> tom); 
Enemy tom = new Enemy(() -> peter); 


public class Enemy { 

    private final Supplier<Enemy> enemySupplier; 

    public Enemy(Supplier<Enemy> enemySupplier) { 
     this.enemySupplier = enemySupplier; 
    } 

    public Enemy enemy() { 
     return enemySupplier.get(); 
    } 

는 피터의 선언과 톰 사이 물론, 피터의 enemySupplier 너무 null을 반환하지만이 코드에 의해 보장된다. 생성자가 여전히 적과 아무 것도하지 않는 경우.

2

Domain driven design 접근 방식을 사용할 수 있습니다. 저는 여러분의 예를 조금 더 일반화하여 어떻게 작동하는지 보였습니다.

class Enemy { 
    Enemy enemy; 

    public Enemy createEnemy() { 
     Enemy enemy = new Enemy(); 
     enemy.enemy = this; 
     this.enemy = enemy; 
    } 
} 

class Peter extends Enemy { } 
class Tom extends Enemy { } 

당신은 다음과 같이 사용합니다 : 피터 피터 = 새로운 피터 (이)`때문에이 설명하는 문제가 있음을

Peter peter = new Enemy(); 
Tom tom = peter.createEnemy(); 
System.out.println(peter.enemy); // returns Tom 
System.out.println(tom.enemy); // returns Peter