Какова лучшая практика для передачи ссылки на объект различным методам? - PullRequest
0 голосов
/ 07 марта 2020

Во-первых, я хотел бы заранее поблагодарить вас за чтение / ответ на мой первый вопрос о переполнении стека. Я новичок в java (android studio) и немного борюсь с пониманием всех этих объектов ...

Я создаю свое первое приложение и создал новый класс для хранения и обработки некоторых свойств Tile.

Я хочу создать экземпляр объекта, а затем использовать ссылку на этот объект, и я передам его другим методам изменения данных в TileProperties. (Я считаю, что это хорошая оптимизация использования памяти)

Я попробовал несколько решений, которые я нашел, но не смог заставить их работать полностью или не мог понять код.

Вот то, что я сделал, и это работает сейчас, но мне интересно, будет ли это наилучшей практикой, а также хорошим ли это вариантом в будущем:

public class TileProperties {

private String length ;
private String width ;
public  static TileProperties object; // I created a static object TileProperties 
                                    // which I use to pass the reference 

public String getLength() {
    return length;
}
public void setLength(String length) {
    this.length = length;
}

Код ниже показывает мою деятельность класс, где пользователь вводит все свойства. Кроме того, это место, где я инициирую свой объект. Tiles

public class TileSettingActivity extends AppCompatActivity {

TileProperties tiles = new TileProperties();

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tile_setting);
}

public void clickOkButton (View view) {

  TileProperties.object = tiles; // save the object reference tiles to be used by others
  EditText lengthTile = findViewById(R.id.editText2);
  tiles.setLength(lengthTile.getText().toString());
  Log.i("Length:", tiles.getLength());

}

А затем в своей основной деятельности я написал следующее:

public class MainActivity extends AppCompatActivity {

 public void clickScanButton(View view){

    TileProperties obj ; // define object reference 
    obj = TileProperties.object; // get the reference of the orginal object Tiles      
    Log.i("info:", obj.getLength());
}

Спасибо !!

1 Ответ

1 голос
/ 08 марта 2020

Нет, это не "лучшая практика". Это даже не «хорошая практика». Это возможно неправильно. Конечно, это было бы неправильно в больших приложениях.

Давайте начнем с этого класса:

public class TileProperties {

private String length ;
private String width ;
public  static TileProperties object; // I created a static object TileProperties 
                                    // which I use to pass the reference 

public String getLength() {
    return length;
}
public void setLength(String length) {
    this.length = length;
}
}

В порядке наименее важен для наиболее важных проблемы:

  1. Существуют различные проблемы стиля. Наиболее важным является то, что отступ является неправильным, и вы выбрали object для имени переменной неверно. Имена переменных должны передавать читателю соответствующее значение.

  2. Документация. Комментарий // I created a static object ... должен быть правильным комментарием javado c, который описывает назначение этой (public!) Переменной.

  3. Publi c переменные нарушают инкапсуляцию и поощряют чрезмерное сцепление. Они не объектно-ориентированные. Их следует избегать.

  4. Publi c static переменные хуже, потому что они также представляют глобальное состояние.

Если вы собираетесь реализовать один общий объект «свойства» для приложения, есть три способа сделать это.

  • Вы можете создать один экземпляр класса и передать это как параметр для всех частей приложения, которые нуждаются в этом. Это может быть неуклюже, если вам нужно передать ссылку на множество мест.

  • Вы можете использовать Singleton design pattern . Простой пример для вашего сценария использования:

      public class TileProperties {
          // state variables
    
          private static TileProperties instance = new TileProperties();
    
          private TileProperties() { }  // This prevents creation of multiple
                                        // instances of the "singleton"
    
          public static TileProperties getInstance() {
              return instance;
          }
    
          // getters and setters for state variables, etc.
      }
    
      // In main
    
      TileProperties props = TileProperties.getInstance();
      props.setLength(42);
    

    Существуют и другие способы реализации синглетонов в Java; например, если синглтон нужно инициализировать лениво.

  • Использование Внедрение зависимостей (DI).

Внедрение зависимостей считается, что он превосходит классы Singleton в крупномасштабных приложениях, потому что синглтоны создают проблемы для модульного тестирования. Тем не менее, DI требует такую ​​среду, как Spring, для реализации внедрения. Это совершенно новая кривая обучения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...