我有一些代码:
public class class1
{
public class1(int count)
{
// count must be 4,6,8
}
}
该类'class1'是我写的SDk库中的公共类。 Count变量对于class1非常重要。它必须是4,6,8。
我想确保程序员(使用我的SDK)无法使用无效的'count'参数创建class1的实例。
我该怎么办?你建议我做什么?
在这里使用枚举是否合适?
答案 0 :(得分:2)
枚举适用于发现但不会帮助您进行验证 - 您仍然可以传入不正确的值。
new class1(FooCount.Four); // Using an enum allows you to write this.
new class1((FooCount)5); // But you can also do this.
要验证值(无论您是否选择使用枚举),请根据允许值列表检查值,如果值为无效值,则引发ArgumentException。
答案 1 :(得分:1)
如果您不想使用例外,则始终存在工厂模式。 您请求具有特定参数的Class1,Factory验证它并在验证失败时返回空对象。
可能还有其他更好的解决方案。在我的脑海中,有3种类型的派生类:ClassCount4,ClassCount5等可能是一个解决方案。
您能否提供一些有关Count为特定值的重要性的更多信息?
编辑:
您可以尝试这样的事情:
class Class1
{
private int _count;
Class1(int Count)
{
_count = Count;
}
public static Class1 Instance (int Count)
{
if (ValidParam(Count))
return new Class1(Count);
return null;
}
private static bool ValidParam(int Count)
{
if ( Count == 4 || Count == 6 || Count == 8 )
return true;
return false;
}
}
答案 2 :(得分:0)
如何抽象class1并为每个计数创建具体实现。使类1构造函数受到保护,您将受到保护。只是一个想法。
答案 3 :(得分:0)
为什么不创建具有公共基类的三个类,而不是让class1接受变量计数?
public abstract class Class1Base
{
protected class1(int count) { }
}
public class Class1Count4
{
public Class1Count4()
: base(4)
{ }
}
// also have implementations for the other eligible values for count.
如果您的算法实际上根据计数而变化(即计数的单独用法之间没有公共代码),那么您可以改为使用接口:
public interface IClass1
{
// Interface methods
}
public class CountImpl4 : IClass1
{
// Implement IClass1 with count being 4.
}
// Other implementations.
使用这些设计中的任何一个,您都可以将无效的用户输入排除在等式之外。另外,如果您需要更改一个实现的工作方式,需要支持其他计数值等,您可以使用另一个类扩展Class1Base /实现IClass1。
由于您希望将其保留在一个类中,为什么不定义要传入的Type-Safe枚举?
public struct CountEnum
{
public readonly int Count;
public static readonly CountEnum Four = new CountEnum(4);
public static readonly CountEnum Six = new CountEnum(6);
public static readonly CountEnum Eight = new CountEnum(8);
private CountEnum(int count)
{
Count = count;
}
}
public class Class1
{
public Class1(CountEnum countEnum)
{
// Access the value via countEnum.Count.
}
}
由于CountEnum只有一个私有构造函数,因此唯一可用的实例是静态定义的Four,Six和Eight。用户现在只能输入四,六或八。由于CountEnum是一个struct,因此null也不可用。