【问题标题】:Should I set up getters and setters even when I only need one of them?即使我只需要其中一个,我是否应该设置 getter 和 setter?
【发布时间】:2013-01-20 19:10:05
【问题描述】:

我有一个对象,其中构造函数的工作是设置字段,并且在此之后不会设置或更改它们。但是,我需要一个吸气剂。那么,即使我永远不会“以防万一”使用它们,我是否还需要设置器,或者我可以删除它们并只留下 getter,同时将值设置给构造函数?

【问题讨论】:

  • 不要编写不需要的代码。你为什么还要呢?这只是浪费时间和更多潜在的错误。
  • 我明白了。谢谢你,很抱歉这个愚蠢的问题:)
  • 省略二传手的能力几乎是重点。您在需要时限制某些操作(即写入)。这就是封装。
  • 默认情况下,你应该努力使你的对象immutable (final fields, no setters)。如果这不可能,那么您可以开始放松该规则。但除非您必须遵守一些外部规范,否则拥有 setter 肯定不是首先要做的事情。
  • 另见这个有趣的讨论:stackoverflow.com/questions/3511120/…,特别强调正确性(更容易推断不改变的状态)和线程安全。

标签: java


【解决方案1】:

根据java bean 规范,省略getter 或setter 是合法的 方法。所以,如果你从不使用 setter,你可以放心地省略它们

【讨论】:

  • 非常感谢。我只是不想执行一些 OOP 失礼;)
  • 这个问题和java bean规范有什么关系?
  • @assylias 不是 java bean 规范的 setter 和 getter 的一部分吗?
  • @GanGnaMStYleOverFlowErroR 我不知道这是否是 OP 的意思 - getter 和 setter 是 IMO 的通用术语。
【解决方案2】:

如果您的构造函数正在设置字段并且您不需要更改它们,它们听起来就像是不可变的。

我会让它们成为最终的,然后只有吸气剂。

如果你省略了final,那么你允许将来有人添加setter。如果您不需要设置器,那么您应该将其作为设计的一部分强制执行,并使用最终字段。

这将使任何阅读代码的人清楚地知道它们在设计上是不可变的。

还有编写比我们需要的更多代码的问题。如果您编写 setter,那么您可能会引入错误,因为此代码可能没有经过全面测试,因为您认为不需要它

【讨论】:

    【解决方案3】:

    如果你想以只读方式使用对象属性并在对象的构造函数中初始化它,那么你不需要设置器。如果你想在这个类之外访问这个属性,那么你需要 getter。

    也建议你阅读这篇SO Question

    【讨论】:

      【解决方案4】:

      以下来自谷歌的建筑师:

      class Foo{
      
         private int a;
         private int b;
      
         public Foo(int num1, int num2){
            a= num1;
            b= num2;
         }
      
         public int getA(){
           return a;
         }
      
         public int getB(){
           return b;
         }
      
      }
      

      这里你不需要setter,一旦你构造了你的对象。你不能改变它的状态。

      【讨论】:

      • 最好将ab 字段也设为final。
      【解决方案5】:

      如果某些内容只有您会看到,这完全是个人选择,因为大多数编辑器都可以为您自动添加它们。

      如果它是永远不应该改变的东西,而且如果它改变了可能会发生坏事,那么它不应该有一个 setter 并且应该是一个私有变量。

      如果您在编写某些东西时着眼于重用和与他人共享,那么您确实需要 getter 和 setter 任何可以这样做的地方,因为您不知道其他人可能需要对您的 API 做什么.

      【讨论】:

        【解决方案6】:

        我认为这取决于您的构造函数在做什么。如果您的构造函数只是对变量进行原始设置,那么我认为您不需要为它们包含设置器。

        但是,如果您的构造函数代码在设置变量的值之前执行任何类型的业务逻辑,那么我认为这需要为至少有问题的变量(如果不是全部)创建一个设置器。

        例如,如果您的构造函数代码执行此操作,则不要包含任何 setter:

        public MyClass( String varA, String varB, int varC )
        {
          this.varA = varA;
          this.varB = varB;
          this.varC = varC;
        }
        

        但如果您的代码这样做,您应该包含一个 setter 来解耦逻辑并使其更简洁:

        public MyClass( String varA, String varB, int varC )
        {
          if ( varA == null )
          {
            this.varA = '(empty)';
          }
          else
          {
            this.varA = varA;
          }
        
          this.varB = varB;
        
          if ( varC < 0 )
          {
            callSomeMethod();
          }
        
          this.varC = varC;
        }
        

        这种逻辑值得创建setter。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-09
          • 1970-01-01
          • 2011-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-10
          • 1970-01-01
          相关资源
          最近更新 更多