繁体   English   中英

将对象引用传递给不同方法的最佳实践是什么?

[英]What is the best practice for passing object reference to different methods?

首先,我要提前感谢您阅读/回答我关于堆栈溢出的第一个问题。 我是 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());
}

谢谢!!

不,这不是“最佳实践”。 这甚至不是“好的做法”。 这可以说是错误的。 在更大的应用程序中肯定是错误的。

让我们从这个类开始:

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 ...应该是一个正确的 javadoc 注释,它描述了这个( public !)变量的用途。

  3. 公共变量破坏封装并鼓励过度耦合。 它们不是面向对象的。 应该避免它们。

  4. 公共static变量更糟糕,因为它们代表全局状态。

如果您要为应用程序实现单个共享的“属性”对象,有三种方法可以实现。

  • 您可以创建该类的单个实例并将其作为参数传递给需要它的应用程序的所有部分。 如果您必须将引用传递到很多地方,这可能会很笨拙。

  • 您可以使用单例设计模式 您的用例的一个简单示例是:

     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)。

依赖注入被认为在大规模应用程序中优于单例类,因为单例在单元测试中存在问题。 但是,DI 需要 Spring 等框架来实现注入。 这是一个全新的学习曲线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM