【问题标题】:Changing an array value in Java method without passing it to method在 Java 方法中更改数组值而不将其传递给方法
【发布时间】:2016-07-20 05:46:44
【问题描述】:

我想创建一个函数来更改数组中的值,但我不想将数组传递给函数。这是代码的一部分,data[] array 在另一个函数中创建。

private int[] data;

public static void main(String[] args) {
    setPixel(3,2); //I'm not sure at this part?
}

public void setPixel(int i,int x){ 
    data[i] = x; //Is there any possible way to change data[]  
}

【问题讨论】:

    标签: java arrays methods static class-members


    【解决方案1】:

    您应该围绕main 方法创建一个类,并在main 中实例化它。然后您将data 设为您的类的变量,您可以从setPixel() 方法中访问它。这是完成您所要求的正确的面向对象 (OO) 方式。

    public class Data {
        private int[] data;
    
        public Data(int size) {
            data = new int[size];
        }
    
        public void setPixel(int i, int x) {
            data[i] = x;
        }
    
        public static void main(String[] args) {
            Data instance = new Data(5);
            instance.setPixel(3, 2);
        }
    }
    

    【讨论】:

      【解决方案2】:

      这是我的答案,与@zposten 提供的非常相似,但也符合 OP 的data[] array created at another function 要求:

      public class EncapsulatedArray
      {
          private final int[] data;
      
          public EncapsulatedArray(final int[] data)
          {
              this.data = data;
          }
      
          public int getPixel(final int i)
          {
              return data[i];
          }
      
          public void setPixel(final int i, final int x)
          {
              data[i] = x;
          }
      
          @Override
          public String toString()
          {
              return Arrays.toString(data);
          }
      }
      

      为了验证和演示,我使用了:

      public class EncapsulatedArrayDemo
      {
          public static void main(final String[] args)
          {
              final int[] dataFromElsewhere = { 0, 1, 2, 3 };
      
              final EncapsulatedArray ex = new EncapsulatedArray(dataFromElsewhere);
      
              System.out.println(ex);
      
              ex.setPixel(2, 7 + ex.getPixel(2));
      
              System.out.println(ex);
          }
      }
      

      并获得以下控制台:

      { 0, 1, 2, 3 }
      { 0, 1, 9, 3 }
      

      像这个(玩具)示例这样的包装类很有用的原因有很多,但是如果您希望“保护”数据数组免受外部更改(即只允许setPixel(int, int) 修改data 中的值)那么您将需要更像@zposten 的答案,它永远不会让data 数组对象从包装器中逃脱。如果您确实需要使用数据数组 created at another function,则需要类似我的解决方案 - 但您必须采取其他步骤来确保数组不会在包装器背后摆弄。

      【讨论】:

        猜你喜欢
        • 2012-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-18
        • 1970-01-01
        • 2016-12-31
        • 2013-10-04
        • 2015-02-16
        相关资源
        最近更新 更多