我想要一个具有私有静态数据成员的类(包含所有字符az的向量).在java或C#中,我可以创建一个"静态构造函数",它将在我创建类的任何实例之前运行,并设置类的静态数据成员.它只运行一次(因为变量是只读的,只需要设置一次),因为它是类的一个函数,它可以访问它的私有成员.我可以在构造函数中添加代码来检查向量是否已初始化,如果不是,则初始化它,但是这会引入许多必要的检查,并且似乎不是问题的最佳解决方案.
我想到,因为变量只是只读的,所以它们只能是公共的静态const,所以我可以在类外面设置它们,但是再一次,它看起来有点像丑陋的黑客.
如果我不想在实例构造函数中初始化它们,是否可以在类中拥有私有静态数据成员?
似乎C#3.0对象初始化程序语法允许在存在无参数构造函数时排除构造函数中的打开/关闭括号对.例:
var x = new XTypeName { PropA = value, PropB = value };
Run Code Online (Sandbox Code Playgroud)
相反:
var x = new XTypeName() { PropA = value, PropB = value };
Run Code Online (Sandbox Code Playgroud)
我很好奇为什么构造函数打开/关闭括号对后面是可选的XTypeName
?
我正在看下面的代码,发现有点奇怪的东西:
public class Sequence {
Sequence() {
System.out.print("c ");
}
{
System.out.print("y ");
}
public static void main(String[] args) {
new Sequence().go();
}
void go() {
System.out.print("g ");
}
static {
System.out.print("x ");
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这会给出一个编译错误,因为System.out
"y"不属于方法声明只是一个{ }
.为什么这个有效?我没有看到这个代码将如何或应该被调用.
当运行它时它也产生x y c g
,为什么static { }
在序列构造函数之前调用get?
所以我最近一直在研究我的Java技能,并且发现了一些我之前不知道的功能.静态和实例初始化器是两种这样的技术.
我的问题是什么时候会使用初始化程序而不是在构造函数中包含代码?我想到了几个明显的可能性:
static/instance initializers可用于设置"final"静态/实例变量的值,而构造函数则不能
静态初始化程序可用于设置类中任何静态变量的值,这应该比在每个构造函数的开头具有"if(someStaticVar == null)// do stuff"代码块更有效
这两种情况都假设设置这些变量所需的代码比简单的"var = value"更复杂,否则似乎没有任何理由使用初始化器而不是在声明变量时简单地设置值.
然而,虽然这些并非微不足道的收益(特别是设置最终变量的能力),但似乎应该使用初始化程序的情况相当有限.
当然可以在构造函数中使用初始化器来完成很多工作,但我真的没有看到这样做的原因.即使一个类的所有构造函数共享大量代码,使用私有initialize()函数似乎比使用初始化程序更有意义,因为它不会阻止您在编写新代码时运行该代码构造函数.
我错过了什么吗?是否还有许多其他情况需要使用初始化程序?或者它是否真的只是在非常具体的情况下使用的相当有限的工具?
java constructor initializer static-initializer initialization-block
我有一个带有一些静态函数的辅助类.该类中的所有函数都需要一个"重"初始化函数才能运行一次(就好像它是一个构造函数).
实现这一目标是否有良好的做法?
我唯一想到的是调用一个init
函数,并且如果它已经运行一次(使用静态$initialized
var)则会中断它的流程.问题是我需要在每个类的函数上调用它.
在Objective-C中,init
方法(即类的指定初始值设定项)和initialize
方法之间有什么区别?应该在每个中放入什么初始化代码?
我是Objective C的新手,我无法确定语言中是否存在等效的静态构造函数,这是类中的静态方法,将在此类的第一个实例之前自动调用被实例化.或者我是否需要自己调用初始化代码?
谢谢
我有大脑痉挛...如何在C++中正确初始化一组对象?
非数组示例:
struct Foo { Foo(int x) { /* ... */ } };
struct Bar {
Foo foo;
Bar() : foo(4) {}
};
Run Code Online (Sandbox Code Playgroud)
数组示例:
struct Foo { Foo(int x) { /* ... */ } };
struct Baz {
Foo foo[3];
// ??? I know the following syntax is wrong, but what's correct?
Baz() : foo[0](4), foo[1](5), foo[2](6) {}
};
Run Code Online (Sandbox Code Playgroud)
编辑:狂野和疯狂的解决方法的想法值得赞赏,但在我的情况下他们不会帮助我.我正在开发一个嵌入式处理器,其中std :: vector和其他STL结构不可用,显而易见的解决方法是创建一个默认构造函数并使用一个init()
可以在构造时间之后调用的显式方法,这样我就不会根本不得不使用初始化器.(这是我被Java的final
关键字+灵活性与构造函数所破坏的情况之一.)
我有一些协议
LoginStrategy
public protocol LoginStrategy {
func login(_ viewController: UIViewController)
func getUserInfo(withCompletionHandler completionHandler: @escaping (_ userInfo: [String: Any]?) -> ())
func createLoginButton(_ frame: CGRect, withCompletionHandler completionHandler: @escaping (_ loginButton: UIView) -> ())
func getUserId() -> String
}
Run Code Online (Sandbox Code Playgroud)
和两个类:
LoginProvider
public class LoginProvider {
public let strategy: LoginStrategy
public func login(_ viewController: UIViewController) {
return self.strategy.login(viewController)
}
public func getUserInfo(withCompletionHandler completionHandler: @escaping (_ userInfo: [String: Any]?) -> ()) {
return self.strategy.getUserInfo(withCompletionHandler: completionHandler)
}
public func createLoginButton(_ frame: CGRect, withCompletionHandler completionHandler: @escaping …
Run Code Online (Sandbox Code Playgroud) initializer ×10
static ×4
constructor ×3
java ×3
c++ ×2
objective-c ×2
c# ×1
class ×1
frameworks ×1
init ×1
ios ×1
kotlin ×1
php ×1
private ×1
swift ×1
syntax ×1
types ×1