【问题标题】:Generic getter and setter methods [closed]通用 getter 和 setter 方法
【发布时间】:2014-07-21 07:28:24
【问题描述】:

我正在尝试编写一个抽象类。这个类将是一个字段。将有不同类型的字段需要扩展字段类并编写自己的 setter 类。例如......会有一个字符串字段和一个整数字段。

String Field 需要扩展 Field 类,但必须有它自己的 setValue 和 getValue 方法,其中有一个 String 变量要设置和返回。 Number Field 必须对 Integer 做同样的事情。

我认为最好的方法是在超类中设置一个通用类型设置值,但我不知道该怎么做。非常感谢任何帮助。

【问题讨论】:

  • 在发布问题之前先做一点谷歌。

标签: java generics setter getter getter-setter


【解决方案1】:

你可以让你的超类通用:

public abstract class Field<T>{
  private T value;

  public void setValue(T value){
     this.value = value;
  }

  public T getValue(){
     return value;
  }
}

如果你现在像这样扩展它:

public class StringField extends Field<String>{
   //nothing to do here.
}

你已经完成了。

【讨论】:

    【解决方案2】:

    像这样:

    public abstract class Field<T> {
        private T value;
        // + constructor(s)
        public T get() {
            return value;
        }
        public void set(T value) {
            this.value = value;
        }
    }
    
    public class StringField extends Field<String>{}
    public class IntField extends Field<Integer>{}
    

    您可能想要添加构造函数,例如 Field(T value) 和 StringField(String s)。

    【讨论】:

      【解决方案3】:

      这看起来是熟悉泛型的一个非常好的做法。现在有很多可用的教程,所以我会尝试解释一下发生了什么,然后我会敦促你也查看其中的一些。

      基本上,您可以将泛型视为一种在运行时告诉您的对象它将具有哪种类型的方法,这是&lt; 和&gt; 中的类型。

      所以ArrayList&lt;String&gt; 将是一个包含String 类型的ArrayList。所以回到你不想做的事情是让你的 Field 类通用。

      这很容易实现:

      public class Field<T> {
          private T field;
      }
      

      现在,当您创建 Field 类的实例时,例如为 String,您只需编写:

      Field<String> f = new Field<>();
      

      要编写与运行时确定的类型相同类型的通用 getter,您需要执行以下操作:

      public class Field<T> {
          private T field;
      
          public T getField() { return field; }
      }
      

      我将把创建 setter 作为练习留给你。

      请记住,在这种情况下,T 是 Field 在运行时获取的类型的占位符。

      【讨论】:

      • 感谢所有贡献的人。我研究过泛型,但不确定如何将其融入我的场景。
      【解决方案4】:

      基本实现

      public abstract class Field<T> {
          private T value;
          // + constructor(s)
          public T get() {
              return value;
          }
          public void set(T value) {
              this.value = value;
          }
      }
      
      public class StringField extends Field<String>{}
      public class IntField extends Field<Integer>{}
      

      更多详情请访问linklink2

      【讨论】:

        【解决方案5】:

        我认为你的建议是完全合理的,它看起来像这样:

        public class Field<T extends Object> {
        
            private T value;
        
            public Field(final T value) { 
                this.value = value;
            }
        
            public T getValue() {
                return value;
            }
        
            public void setValue(final T value) {
                this.value = value;
            }
        }
        

        注意,我特意做了这个,不是故意的。除非您确实想为特定字段类型实现额外功能,否则无需将其用作超类。所以你可以像这样定义你的 Sting 字段和 Number 字段:

        Field<String> stringField = new Field<String>();
        Field<Integer> numberField = new Field<Integer>();
        

        当然,如果您确实希望在 Field 的类型化版本中实现额外的实现,那么将其抽象化并按如下方式定义您的子类:

        public class StringField extends Field<String> {
            public StringField(final String value) {
                super(value);
            }
        }
        
        public class NumberField extends Field<Integer> {
            public NumberField(final Integer value) {
                super(value);
            }
        }
        

        【讨论】:

        • abstract class 在哪里?
        • 公平的问题,我会更清楚地说明我的观点。
        【解决方案6】:
        public abstract class MyClass<T>{
          private T field;
        
          public T getField(){
            return field;
          }
        
          public void setField(T field){
            this.field = field;
          }
        }
        
        
        public class MyClassWithString extends MyClass<String>{}
        

        【讨论】:

          猜你喜欢
          • 2011-04-14
          • 2017-09-09
          • 2016-11-30
          • 2017-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多