2011-03-30 106 views
3

我已经写了一个构造函数并传递一个布尔标志来决定将哪个值设置为类变量。代码如下if else在类构造函数中的条件......是不是很好的做法?

public PDFParagraph(PDFPhrase phrase,boolean isRtl) { 
      super(phrase); 
      if(isRtl) 
        this.setAlignment(Element.ALIGN_RIGHT); 
      else 
        this.setAlignment(Element.ALIGN_LEFT); 
    } 

现在我很困惑,不知道如果我添加if ... else条件在构造函数中。设置类变量值是否是很好的风格?

谢谢, Hanumant。

+0

有没有必要把'this'放在方法调用之前。 – 2011-03-30 06:49:57

+0

同意史蒂夫。 AFAIK,只有两个需要'this'的实例:(1)当本地和成员变量之间存在歧义时,例如, 'this.myInt = myInt;',或者(2)如果您传递成员作为参数,例如'new BinaryFormatter()。Serialize(fileStream,this);'这适用于变量,属性,函数等... – Ozzah 2011-03-30 22:15:14

回答

5

构造函数中的条件本身并不成问题。然而,在这种情况下,我倾向于这样写你的构造函数:

public PDFParagraph(PDFPhrase phrase, boolean isRtl) { 
    super(phrase); 
    setAlignment(isRtl ? Element.ALIGN_RIGHT : Element.ALIGN_LEFT); 
} 
0

我建议你使用enum和switch语句而不是布尔值。当你添加另一个对齐时会发生什么?

1

如果您只是通过初始对齐设置,那么对于构造函数的用户可能会更加清楚,尤其是如果它是Enum并且这些是唯一的可能性。但是,如果您试图限制初始对齐方式并且它的格式与String类似,那么您所做的操作似乎很好。尽管如此,您仍可能想要考虑一个Enum。读取比将truefalse传递给构造函数更容易。

+1

一旦你有多个这样的布尔参数(“true,false”是什么意思?或者我想在这里写'false,true?'),这会变成一个更大的问题 – 2011-03-30 05:11:53

+0

@Joachim:同意,肯定会越来越多与更多布尔人混淆。 – WhiteFang34 2011-03-30 05:19:19

+0

@Joachim Sauer,@ WhiteFang34,感谢您的输入,我已经使用枚举而不是布尔值。 – hanumant 2011-03-30 05:21:33

1

当然,您可以将if/else语句添加到构造函数中。

通常情况下,最好的做法是将方法尽可能原子化(简短并且切合实际)并尽可能清晰地定义。这也适用于构造函数。您希望构造函数根据您传递的参数设置您的对象。

如果你需要一个if/else,那么你可以放一个。 如果你需要的话,你甚至可以发疯,并放置一个for循环。 ;)

+0

感谢@Ozzah的输入。 – hanumant 2011-03-30 05:22:03

2

使用if/else这样做没有样式问题。但是:

  • 您能更简单地写:

    setAlignment(isRtl ? Element.ALIGN_RIGHT : Element.ALIGN_LEFT); 
    
  • 很多人(包括我自己)认为你应该始终把围绕“然后”和“其他”的语句花括号。


与此相关的一点:如果你发现自己写一个构造函数,如下所示:

public Thing(boolean cond, ...) { 
    super(...); 
    if (cond) { 
     // Lots of statements 
    } else { 
     // Lots of different statements 
    } 
    ... 
} 

它可能是你需要重构你的构造函数的指示。 (或者可能不是......这取决于细节)。

+0

谢谢@Stephen C – hanumant 2011-03-30 05:20:03

+0

或者您应该有两个与继承有关的类。 – MeBigFatGuy 2011-03-30 05:55:01

+0

是的......这是另一种可能的重构。这一切都取决于细节。 – 2011-03-30 06:11:17

相关问题