Два класса совместно используют статическую переменную в Java - PullRequest
0 голосов
/ 02 октября 2018

У меня есть два класса, класс Place и класс Game.Это не отношения наследования, но я хочу, чтобы у моего класса Game была древовидная карта Place, а у класса Place - древовидная карта, но я хочу, чтобы обе древовидные карты были одним и тем же, чтобы мне не приходилось постоянно обновлять оба.

Другая проблема, которая возникла, была связана с природой того, что мне нужно делать, всякий раз, когда я создаю объект place в конструкторе, мне нужно немедленно помещать объект в древовидную карту с помощью place.put (id,это), и проблема в том, что конструктор требует, чтобы я инициализировал свою древовидную карту, но если я инициализирую ее каждый раз, когда вызывается конструктор, очевидно, я буду получать новые карты каждый раз.

Короче говоря, мне нужен способ, чтобы два класса совместно использовали одну и ту же статическую древовидную карту и 2. просто инициализировали ее один раз, чтобы я не переинициализировал ее.Я думал сделать что-то напуганное, например, иметь логический элемент данных isSet, но я не хочу идти по этому пути.

public Place(Scanner fileInput, Report rep) {
    // this constructor will only read enough information for one
    // place object and stop on the line for which place it read
    name = "";
    description = "";

    // report object contains fields to initialize to help
    // validate the data. // see report class
    int idNumber; 
    int linesToRead; // number of lines to read for one place object
    while ( (fileInput.hasNextLine() ) && rep.placeInfoFound() == false  ) {
    //1. Call getline. getline has a while loop that will continue
    // until it reaches a line of data worth reading
    // first data we expect is the places line
    // after that, we will be on the 'PLACES line which will have
    // two fields, both place and id.
    //2 call ListToTokens which will make an arraylist of words
    // where each element is a token. token sub 1 is the number of
    // places.

        ArrayList<String> tokens = new ArrayList<String>();
        tokens = findPlaceInfo(fileInput, rep);
    }
    places = new TreeMap<Integer, Place>();
    places.put(id, this);
    //WE HAVE TO REINITIALIZE the fact that we found
    // place info back to false so that when we call again
    // we can run the while loop
    rep.assert_place_info_found(false);
} // function brace

private static TreeMap<Integer, Place>places;

1 Ответ

0 голосов
/ 02 октября 2018

Вы хотите сделать карту статическим членом класса Place (или класса Game, неважно, какой) следующим образом:

import java.util.Map;
import java.util.TreeMap;

public class Place {
    //  Static Attributes
    private static final Map<Place, Object> places = new TreeMap<>();

    //  Constructors
    public Place(final Object key, final Place value) {
        places.put(key, value);
    }

    //  Methods - Static Getters
    public static Map<Place, Object> getPlaces() { return places; }
}

Итак, из вашего класса 'Game' выможно вызвать функцию Place :: getPlaces статически.Если вы еще не создали класс Place, он загрузит класс и создаст экземпляр статического объекта.Затем вы можете кэшировать эту ссылку, если захотите.

При этом я бы посоветовал не структурировать ваш код так, чтобы полагаться на статические данные, так как такая тесная связь может привести к более сложному коду, которыйпрыгает повсюду.Хотя я не могу сделать слишком много предложений, не зная вашего проекта и его требований лучше, поэтому я оставлю это на этом.

Удачи!

...