점수가 아닌 비 정적 정수가있는 Game이라는 Java 클래스가 있습니다.정적 메서드를 사용하여 비 정적 변수를 늘리는 방법은 무엇입니까?
각 게임 개체의 점수를 1 씩 증가시키는 static 메서드를 구현하려고합니다.이 메서드는 increaseAllScore()입니다. 이것이 가능한가? 이런 식으로 뭔가를 시뮬레이션 할 수 있을까요?
점수가 아닌 비 정적 정수가있는 Game이라는 Java 클래스가 있습니다.정적 메서드를 사용하여 비 정적 변수를 늘리는 방법은 무엇입니까?
각 게임 개체의 점수를 1 씩 증가시키는 static 메서드를 구현하려고합니다.이 메서드는 increaseAllScore()입니다. 이것이 가능한가? 이런 식으로 뭔가를 시뮬레이션 할 수 있을까요?
당신은이 같은 구현을 할 수있는 :
int score;
static int scoremodifier;
public static void increaseAllScore() {
scoremodifier++;
}
public int getScore() {
return score + Game.scoremodifier;
}
이 작업을 수행하는 유일한 방법은 정적 메서드가 Game 개체에 대한 참조에 액세스하는 메커니즘을 제공하는 것입니다. 이를 수행하는 한 가지 방법은 각 Game 객체를 정적 데이터 구조에 등록하는 것입니다.
예를 들어, 당신은이 작업을 수행 할 수 있습니다 세트가 가비지 수집 그것에 다른 참조가없는 경우 인에서 게임을 방해하지 않도록 내가 여기 WeakReference<Game>
을 사용하고
public class Game {
private static Set<WeakReference<Game>> registeredGames
= new HashSet<WeakReference<Game>>();
private int score;
public Game() {
// construct the game
registeredGames.add(new WeakReference(this));
}
. . .
public static incrementAllScores() {
for (WeakReference<Game> gameRef : registeredGames) {
Game game = gameRef.get();
if (game != null) {
game.score++;
}
}
}
}
.
+1, 약한 참조 – bobah
기술적으로 가능하지만 일반적으로 나쁜 디자인입니다 *입니다. 대신 생성 된 모든 Game
인스턴스에 대한 참조를 보유 할 모든 게임 (class Games
)의 컨테이너를 만듭니다. 대부분의 Games
클래스는 생성 된 모든 게임의 수명주기를 완전히 제어하는 createGame()
메서드를가집니다.
Games
클래스를 사용하면 기본적으로 생성 된 모든 Game
인스턴스를 반복하여 모든 인스턴스의 점수를 1 점씩 올릴 수있는 비 정적 increaseAllScores()
메서드를 사용할 수 있습니다.
* - 모든 인스턴스의 static List<Game>
을 만들고 해당 목록을 Game
생성자 내부에서 수정하십시오.
은이 문제에 대한 해결책의 개요 것 :
static final List<Game> games = new ArrayList<>();
public class Game {
public Game() {
games.add(this);
}
}
public static void increaseAllScore() {
for (Game g : games) game.increaseScore();
}
이 가능하지만, 약간의 부기를 필요로한다. 본질적으로 기존의 모든 게임에 정적 인 포인터 세트를 보관해야합니다. 게임의 생성자에서는이 목록에 추가해야하며 소멸자에서 다시 제거해야합니다.
아마도 더 나은 방법은 scoreOffset
또는 이와 비슷한 정적 변수를 갖는 것입니다. 그런 다음 인스턴스 점수를 받아서 정적 인 scoreOffset
을 추가하여 게임의 점수를 계산할 수 있습니다.
increaseAllScore
메서드에 Game
인스턴스에 대한 정적 액세스 권한이있는 경우에만 수행 할 수 있습니다 (인수 목록에서 전달하거나 정적으로 저장된 목록 있음).
불가능합니다. 먼저 객체 지향 프로그래밍의 기초를 배우십시오. 당신은 모든 게임에 대한 참조를 보유 할 수있는 작업 adound으로
:public class Game {
private static List<Game> allGames = new ArrayList<Game>();
public Game createNewGame() {
Game game = new Game();
allGames.add(game);
return game;
}
public static void increaseAllGames() {
for (Game game : games) {
game.increaseScore();
}
}
}
이 그냥 구현 예이다; 디자인을 위해 나는 같은 클래스에 넣지 않을 것이다.
을 사용하는 것이 좋습니다. 그게 내가 생각한 것입니다. 나는 이걸로 갈 것 같아. 나는 더 시원한 것이있을 것이라고 생각했다. 감사! – n00b