静态属性如何引用非静态方法?
例:
public static int UserID
{
get
{
return GetUserID();
}
}
private int GetUserID()
{
return 1;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,我得到错误:"非静态字段,方法或属性需要对象引用"GetUserID()"
我的静态HTTPS连接方法存在很大问题.每秒请求失败并HttpsUrlConnection.getResponseCode()返回-1.所以每次调用都很有效,按预期返回数据.
这是我在我的应用程序的不同角落使用的静态类的方法.我猜想当方法第一次返回时,有什么东西我没有正确清理,并且通过第二次调用方法可能会导致问题被破坏.但我很难找到任何线索.
我目前正在使用此类与无效SSL证书的主机通信.不会在应用程序的最终版本中使用它,但是现在我需要省钱.;)
public static String makeInvalidHTTPSRequest(String url, String[] postVars, String userName, String userPass, Context ctx) throws MalformedURLException, IOException, NoSuchAlgorithmException, KeyManagementException {
StringBuffer sb = new StringBuffer();
String serverAuth = null;
String serverAuthBase64 = null;
StringBuffer urlParameters = new StringBuffer();
InputStream rcvdInputStream = null;
if (checkNetworkAvailability(ctx) == false) {
GeneralMethods.writeLog("Network unavailable", 1, GeneralMethods.class);
return null;
}
SSLContext sc = null;
sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[] { new KTPTrustManager() }, new SecureRandom());
GeneralMethods.writeLog("makeInvalidHTTPSRequest-> " …Run Code Online (Sandbox Code Playgroud) 我有一些方法可以让我查找一些标识符,所以基本上运行SQL查询并传回一个值.
目前它们不是静态的.从性能的角度来看,将它们设置为静态是否有意义,即内存较少并节省实例化对象所需的时间?或者这些考虑因素并不重要.
用静态方法有一点疑问.
文档说"静态方法无法访问实例成员变量或静态方法和属性只能访问静态字段和静态事件,因为它在创建实例之前就已经执行了很多".因此,下面的代码无法编译
class staticclass
{
int a = 20; //Private member
public static void staticmethod()
{
Console.WriteLine("Value Of Instance member variable is: {0}",a); // Error
}
}
Run Code Online (Sandbox Code Playgroud)
但我们也知道,在静态方法中,我们可以创建同一个类的实例.
所以,稍微更改上面的代码我可以在静态方法中访问实例变量
class staticclass
{
int a = 20; //PRivate Memeber
public static void staticmethod()
{
staticclass sc = new staticclass();
Console.WriteLine("Value Of Instance member variable is: {0}",sc.a);
}
}
Run Code Online (Sandbox Code Playgroud)
编译精确并显示结果Value Of Instance member variable is: 20.
这是正常行为吗?或者我无法正确理解它?
我的意思是,如果是这样的情况,那么这些陈述是否成立static methods can only access static fields?
谢谢.
我要问的是这样做是否有区别:
public Something importantBlMethod(SomethingElse arg) {
if (convenienceCheckMethod(arg)) {
// do important BL stuff
}
}
private boolean convenienceCheckMethod(SomethingElse arg) {
// validate something
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
public Something importantBlMethod(SomethingElse arg) {
if (convenienceCheckMethod(arg)) {
// do important BL stuff
}
}
private static boolean convenienceCheckMethod(SomethingElse arg) {
// validate something
}
Run Code Online (Sandbox Code Playgroud)
我实际上使用选项1,因为它对我来说似乎更自然.
那么第一种和第二种方式之间的风格/约定/性能差异是什么?
谢谢,
正如我在测试中所建议的那样,在我的基准测试中,动态方法更快.
这是测试代码:
public class Tests {
private final static int ITERATIONS = 100000;
public static void main(String[] args) {
final long start = new Date().getTime();
final …Run Code Online (Sandbox Code Playgroud) 我是C#的新手,我在从Main()方法调用函数时遇到了一些问题.
class Program
{
static void Main(string[] args)
{
test();
}
public void test()
{
MethodInfo mi = this.GetType().GetMethod("test2");
mi.Invoke(this, null);
}
public void test2()
{
Console.WriteLine("Test2");
}
}
Run Code Online (Sandbox Code Playgroud)
我在编译错误test();:
非静态字段需要对象引用.
我还不太了解这些修饰语,所以我做错了什么?
我真正想做的是将test()代码放在里面,Main()但是当我这样做时它会给我一个错误.
我试图使用EasyMock + PowerMock模拟静态方法.如果我不模拟静态方法,那么我得到异常java.lang.ExceptionInInitializerError但是具有不同的堆栈跟踪,这纯粹是由于我的代码文件而且错误是显而易见的.但是,如果我使用EasyMock + PowerMock模拟静态方法,则PowerMock.mockStaticNice(Classname.class)行会抛出相同的异常但具有不同的堆栈跟踪.堆栈跟踪是:
java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:386)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:219)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
at net.sf.cglib.proxy.Enhancer.createClass(Enhancer.java:317)
at org.easymock.internal.ClassProxyFactory.createProxy(ClassProxyFactory.java:175)
at org.easymock.internal.MocksControl.createMock(MocksControl.java:114)
at org.easymock.internal.MocksControl.createMock(MocksControl.java:88)
at org.easymock.internal.MocksControl.createMock(MocksControl.java:79)
at org.powermock.api.easymock.PowerMock.doCreateMock(PowerMock.java:2212)
at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2163)
at org.powermock.api.easymock.PowerMock.mockStaticNice(PowerMock.java:331)
at PackageName(ClassName.java:125)
............................
Run Code Online (Sandbox Code Playgroud)
第125行是PowerMock.mockStaticNice(Classname.class)
我已经尝试过这样:
1)在PrepareForTest中提及包含静态方法的类名({class1.class,class2.class,class3.class})
2)在@中模拟静态方法在注释之前.
我在最近2天遇到了这个问题.请提出解决方案.
是否可以像在Ruby中那样在模块中执行静态方法?
module Test
self.def test
puts "test"
end
end
Test::test
Run Code Online (Sandbox Code Playgroud)
expecting token 'EOF', not 'end'如果调用在同一个文件中(如例子中所示),我得到一个if,expecting token 'CONST', not 'test'如果我将调用放在另一个文件中.
我做错了什么?Crystal中的模块中是否有静态方法?
我想将类变量作为默认值传递给静态方法。但是当我导入类时,我得到一个错误NameError: name 'MyClass' is not defined
class MyClass:
x = 100
y = 200
@staticmethod
def foo(x = MyClass.x, y = MyClass.y):
return x*y
Run Code Online (Sandbox Code Playgroud) 我想实现一个简单的静态类,该类可以在练习时计算c ++中整数的pow值。所以我的代码在这里:
#pragma once
#ifndef MATH_H
#define MATH_H
static class Math
{
public:
static int pow(int,int);
};
#endif /* MATH_H */
Run Code Online (Sandbox Code Playgroud)
和pow功能的实现:
#include "Math.h"
int Math::pow(int base, int exp){
if(exp==1)
return base;
else if(exp%2==0)
return pow(base,exp/2)*pow(base,exp/2);
else
return pow(base,exp/2)*pow(base,exp/2)*base;
}
Run Code Online (Sandbox Code Playgroud)
但是cygwin编译器抛出编译错误:
In file included from Math.cpp:16:0:
Math.h:16:1: error: a storage class can only be specified for objects and functions
static class Math
^~~~~~
Run Code Online (Sandbox Code Playgroud)
static-methods ×10
java ×3
c# ×2
android ×1
c#-2.0 ×1
c++ ×1
class ×1
coding-style ×1
crystal-lang ×1
easymock ×1
module ×1
performance ×1
powermock ×1
python ×1
static ×1
unit-testing ×1