我使用过几种不同的语言,如Java,C#和Objective-C.
在大多数语言中,不需要对象实例的方法称为静态方法.然而,当谈到Objective-C时,有些人在你称之为静态方法时会变得防守,并且他们希望你将它们称为类方法.
为什么他们称为类方法而不是静态方法?静态方法和类方法有什么区别?
我是一名Java开发人员,他开始掌握依赖注入的全部功能,我突然意识到没有办法注入静态方法.所以它让我思考:静态方法DI反模式?
更重要的是:如果我要接受依赖注入,这是否意味着我需要停止编写静态方法?我问,因为没有办法在单元测试中模拟它们并注入模拟静态,这对我来说是一个巨大的转折点.
编辑:我知道"包装"和注入现有静态方法的常用方法是这样的:
public class Foo {
public static void bar() { ... }
}
public interface FooWrapper {
public void bar();
}
public class FooWrapperImpl implements FooWrapper {
public void bar() {
return Foo.bar();
}
}
Run Code Online (Sandbox Code Playgroud)
...但我不是在问如何注入一个现有的静态方法...我问我是否应该完全停止写它们,如果我所有的代码(从这一点开始)都要接受DI的概念.
此外,我看到很多与此类似的相关问题,但无法找到提出相同问题的完全匹配.如果你发现它确实是另一个问题的愚蠢,请指出我,我将自己关闭这个问题(请不要只是关闭它!).
我有一些信息存储为SharedPreferences.我需要从外部的Activity(从域模型类中)访问该信息.所以我在Activity中创建了一个静态方法,我只用它来获取共享首选项.
这给了我一些问题,因为显然不可能从静态方法调用方法"getSharedPreferences".
这是eclipse给我的信息:
Cannot make a static reference to the non-static method
getSharedPreferences(String, int) from the type ContextWrapper
Run Code Online (Sandbox Code Playgroud)
我尝试使用Activity实例来解决这个问题,如下所示:
public static SharedPreferences getSharedPreferences () {
Activity act = new Activity();
return act.getSharedPreferences("FILE", 0);
}
Run Code Online (Sandbox Code Playgroud)
此代码提供null点异常.
有解决方法吗?我试图这样做,我会进入一个android-code气味?
提前致谢.
目前在PHP中使用大型平台.
它托管的服务器最近已升级到PHP 5.4.
从那以后,我收到了很多错误消息,如:
[Sat 5月26日19:04:41 2012] [错误] PHP严格标准:非静态方法Config :: getData()不应该静态调用,假设$ this来自/xxx/Config.inc.php中的不兼容上下文第35行
示例方法定义为(注意缺少'static'关键字):
function &getData() {
$configData =& Registry::get('configData', true, null);
if ($configData === null) {
// Load configuration data only once per request, implicitly
// sets config data by ref in the registry.
$configData = Config::reloadData();
}
return $configData;
}
Run Code Online (Sandbox Code Playgroud)
这之前没有引起任何问题,我认为错误消息(导致应用程序崩溃)可能与最近升级到PHP5.4有关.
是否有PHP设置我可以修改为"忽略"缺少静态关键字?
是否可以像在Java中那样从C++中的静态方法返回一个对象?我这样做:
class MyMath {
public:
static MyObject calcSomething(void);
private:
};
Run Code Online (Sandbox Code Playgroud)
我想这样做:
int main() {
MyObject o = MyMath.calcSomething(); // error happens here
}
Run Code Online (Sandbox Code Playgroud)
MyMath类中只有静态方法,因此实例化它没有意义.但我得到这个编译错误:
MyMath.cpp:69:错误:在'.'之前预期的primary-expression 代币
我究竟做错了什么?我是否必须实例化MyMath?如果有可能,我宁愿不要.
什么时候在方法签名上使用Java中的static关键字被认为是不好的做法?如果方法基于某些参数执行函数,并且不需要访问非静态的字段,那么您是否总是希望这些类型的方法是静态的?
在这里,我正在创建一个仅依赖于Internet的在线应用程序.
因此,每当出现网络错误时,都必须通知用户.为此,我创建了一个BroadcastReciver,它在网络连接丢失时接收呼叫(Internet).
这一切都很完美.现在我需要的是我必须从这个广播接收器调用一个Activity方法,在那里我创建了一个Alert Dialogue.
我在stack-overflow.com上读了很多答案,我可以声明该方法是静态的,只使用Activity名称调用,
例如 MyActivityName.myMethod()
但我不能声明我的方法是静态的,因为我在那里使用Alert Dialogue,它显示我在线错误,
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
Run Code Online (Sandbox Code Playgroud)
即不能在静态的环境中使用此.
那么,如何从广播接收器调用Activity方法(必须不是静态且不启动该活动)?
我可以从当前正在运行的广播接收器获取活动(或片段)名称吗?
methods android static-methods broadcastreceiver android-activity
如果我定义:
class Bar(object):
@staticmethod
def bar():
# code
pass
class Foo(Bar):
# code
pass
Run Code Online (Sandbox Code Playgroud)
函数调用Foo.bar()是否可以确定类名Foo?
我有以下困惑.据我所知,在声明方法时静态和类关键字之间的主要区别在于第二个可以在子类中重写.
问题
但是,当我在Swift 1.2中声明一个协议时,如下所示:
protocol MyProtocol
{
class func dummyClassMethod()
}
Run Code Online (Sandbox Code Playgroud)
编译器给出错误:
类方法只允许在类中; 使用'static'来声明静态方法
这个错误非常具有描述性,因为很明显MyProtocol不是一个类,但是我想让一个类func成为协议的一部分.
我试过的
我发现如果我将协议中的接口声明为静态,编译器很高兴我可以在采用此协议的所有类中使用此静态方法:
protocol MyProtocol
{
static func dummyClassMethod()
}
Run Code Online (Sandbox Code Playgroud)
这个问题
所以我的问题基本上就是这样吗?这个声明声明我的类方法不能在子节点中重写,但是在我的实现中我可以编写并使用以下内容:
class ClassA: MyProtocol
{
class func dummyClassMethod() {
}
}
class ClassB: ClassA
{
override class func dummyClassMethod() {
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的dummyClassMethod不再是静态的......
编译器很好,一切正常 - 但为什么呢?
它是否特定于接口本身是静态的,但它的实现不是?
Objective-C解决方案
在ObjC中,这非常简单,编译和运行完美:
@protocol MyProtocol
+(void)dummyClassMethod;
@end
Run Code Online (Sandbox Code Playgroud) 我想创建一个类,其中将保留所有实用程序方法,并且这些方法将在整个应用程序中使用.
问题:1
创建单例类并保留所有必要的方法或者我应该创建一个所有函数都是静态的类是不错的.
问题:2
swift上面两种方法的主要区别是什么?
问题:3
它将如何影响iOS的性能?
static-methods ×10
android ×2
class-method ×2
ios ×2
java ×2
swift ×2
c++ ×1
methods ×1
mocking ×1
objective-c ×1
php ×1
protocols ×1
python ×1
reflection ×1
singleton ×1
static ×1
terminology ×1