标签: static-members

为什么在 Java 中使用类名而不是对象来访问类方法或变量更好?

我正在阅读http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-137265.html#587的 Java 代码约定。

其中,他们提到我们应该避免使用对象来访问类变量或方法,而应该使用类名。

避免使用对象访问类(静态)变量或方法。请改用类名。例如:

classMethod();             //OK 
AClass.classMethod();      //OK
anObject.classMethod();    //AVOID!
Run Code Online (Sandbox Code Playgroud)

在术语、性能或其他方面是否有特殊原因?

java static-methods static-members

1
推荐指数
1
解决办法
2149
查看次数

如何在不实例化的情况下访问成员变量,C++

假设我有一个类 B,它在另一个类 A 的构造函数中获取了一个值“v”。我如何从类 C 中读取这个值?类 C 将按需实例化,但 A 已经创建了 B 并且已经通过了 'v'。'v' 会在每次实例化时改变。我试图在 B 类中使 'v​​' 为静态。它会起作用吗?我无法正确实施它。

Class A {
 public:
 int* v;
 B b1;
 A(int* var) : v(var), b1(var) {};
}
Run Code Online (Sandbox Code Playgroud)

如何从 C 类访问相同版本的“v”?我可以定义 B 和 C,但是我喜欢以实现目标。但我不能为此目的更改 A。

c++ inheritance constructor class static-members

1
推荐指数
1
解决办法
3410
查看次数

C++ 将静态成员 std::array 元素初始化/填充为特定值

我想知道是否有适当的方法可以做到这一点。

举个例子:

struct Test {
    static std::array<unsigned, 123> data;
};

std::array<unsigned, 123> Test::data = {};
Run Code Online (Sandbox Code Playgroud)

如果我想将 中的所有元素设置为data某个值,例如 5。

我可以做这样的事情:

struct Test {
    static std::array<unsigned, 123> data;
private:
    static decltype(data) init_data_arr() {
        decltype(data) arr = {};
        arr.fill(5);
        return arr;
    }
};

std::array<unsigned, 123> Test::data = Test::init_data_arr();
Run Code Online (Sandbox Code Playgroud)

但随后我会分配额外的数组内存并对其进行复制,这似乎并不理想。

另一种内存密集程度较低的选项是这样的:

struct Test {
    static bool is_init;
    static std::array<unsigned, 123> data;

    Test() {
        if (!is_init) {
            is_init = true;
            data.fill(5);
        }
    }
};

bool Test::is_init = false;
std::array<unsigned, 123> Test::data = {}; …
Run Code Online (Sandbox Code Playgroud)

c++ arrays static-members array-initialization

1
推荐指数
1
解决办法
2782
查看次数

constexpr 真的意味着 const 吗?

比较以下内容:

我在一个类中有一个静态成员,要么是const constexpr要么只是constexpr. 根据MS Docs上的解释,constexpr 意味着常量:

所有 constexpr 变量都是 const。

然而,这会在 gcc 8.4 中发出警告:

#include <iostream>
#include <string>

struct some_struct
{
    static constexpr char* TAG = "hello";
    void member() {
        printf("printing the tag %s", TAG);
    }  
};

int main()
{
    some_struct A;
    A.member();
}
Run Code Online (Sandbox Code Playgroud)

虽然这不会:

#include <iostream>
#include <string>

struct some_struct
{
    static const constexpr char* TAG = "hello";
    void member() {
        printf("printing the tag %s", TAG);
    }  
};

int main()
{
    some_struct A; …
Run Code Online (Sandbox Code Playgroud)

c++ constants static-members constexpr c++17

1
推荐指数
1
解决办法
565
查看次数

OOP中的静态和动态变量/方法是什么?

我想更好地理解OOP中的基本概念.面向对象编程中的静态和动态变量和方法是什么?例如,使用$ this与双冒号(::)之间的区别是什么?

$ this($ this-> a_method())

  • 好处: ?.
  • 缺点:?......"这个"不是自我记录的,如:$this->method_from_an_extended_class().

双冒号(someclass :: a_method())

  • 好处: ?
  • 缺点:?

php oop dynamic static-members

0
推荐指数
1
解决办法
4497
查看次数

在Java Servlet中使用静态变量(例如在AppEngine中)

我有一个应用程序,其中Servlet有一个方法调用Update(ReqIn, ReqOut).我从doGet&调用它doPost并传递Request和Response变量,然后Update(...)填写以下静态变量:

...
public class Server extends HttpServlet {

    public static HttpServletRequest In = null;
    public static HttpServletResponse Out = null;

    public static boolean isDebug = true;
    public static boolean isPost = false;

    public static String URL = "";
    public static String IP = "0.0.0.0";
    public static Cookie[] Cookies = null;

    public static UserClass User = null;
    public static boolean isLoggedIn = false;


    ...
}
Run Code Online (Sandbox Code Playgroud)

基本上抽象最常用的东西并在每次请求时更新它.这也允许我从网站的任何地方访问IP地址和当前用户数据,只需Server.User.getUsername();编写每次加载页面时使用新的类实例并使用更长的访问代码:Server.getUser().getUsername();

现在的问题是:当在多用户环境(AppEngine上的Jetty)时,这会引入任何问题吗?例如,一些线程/赛车问题使用户看到不正确的IP地址,或者在极端情况下突然以不同的用户身份登录?

或者我应该重写代码并将其更改为 …

java google-app-engine servlets jetty static-members

0
推荐指数
2
解决办法
5126
查看次数

像static一样在类上调用常量属性?

我有一个抽象的基类

public class Base
{
  public abstract String Info { get; }
}
Run Code Online (Sandbox Code Playgroud)

和一些孩子.

public class A : Base
{
  public override String Info { get { return "A does ..."; } }
}

public class B : Base
{
  public override String Info { get { return "B does ..."; } }
}
Run Code Online (Sandbox Code Playgroud)

这只是一个常数,但我想确保使用Base所有类实现它.

现在我有时没有对象实例但想要访问A.Info- 这是不可能的,因为它是一个实例属性.

除了在静态级别上实例AND上实现相同属性之外,还有其他方法吗?这将是一个重复违反DRY编程风格的感觉.


新编辑:我现在看到这两个解决方案:

public class Base
{
  public abstract String ClassInfo { get; }
}

public class A : …
Run Code Online (Sandbox Code Playgroud)

c# inheritance static-members

0
推荐指数
1
解决办法
655
查看次数

是否可以在.cpp文件中定义类的静态成员函数而不是其头文件?

我有一个函数,应该只为class.i的所有实例运行一次.我想使用静态函数调用方法.所有Web示例都显示静态函数在Header文件(类内)中定义.我的功能很大我无法在头文件中定义我该怎么办?为了那个原因.

c++ constructor class static-members

0
推荐指数
1
解决办法
1145
查看次数

我应该在头文件中哪里声明我的私有类级静态常量?

我应该在头文件中指定我的类级静态常量?

class ABC
{
public:
    enum A1
    {
    };

    //Manager functions
    ABC(int x )
    {
        m_x = x;
    };
    viirtual ~ABC();

protected:
    int data;

private:
    //Typedef
    typedef std::pair(int, int) INT_PAIR;
    typedef std::pair(int, int) INT_PAIR1;
    ...
    //functions
    void increment_x();
    //Member data
    int m_x;
    ... whole lot of other data
}
Run Code Online (Sandbox Code Playgroud)

我应该在这个类声明(ABC.h)中声明一个私有静态const变量,如版本号?

static const std::string version;
Run Code Online (Sandbox Code Playgroud)

它究竟适合哪里?它不是真正的成员数据,因为它是静态的.(不是每个对象)

编辑 - 1:

这些变量是否有特定的优先级?它们是在开始时(在ABC类之后的第一个开口大括号之后?或者在我的代码段中的私有关键字之后?)(或者)是在typedef之后吗?

当然我会在我的abc.cpp文件中提到const std :: string version ="10";

编辑2:我期待卢卡斯提到的答案.(请提供有效的推理)

在类似我下面提到的类声明中,应该放置静态变量吗?

请不要提供答案,提到decl需要在.cpp文件中的.h文件和定义中. - 我已经知道了.

c++ static-members

0
推荐指数
1
解决办法
1232
查看次数

静态块和静态域有什么区别?

我看了这个问题而且很困惑.他使用静态块.他为什么要写一行?

这两者有什么区别?

private static Pattern email_pattern = Pattern.compile(EMAIL_PATTERN);
Run Code Online (Sandbox Code Playgroud)

private static Pattern email_pattern;

static {
    email_pattern = Pattern.compile(EMAIL_PATTERN);
}
Run Code Online (Sandbox Code Playgroud)

java static static-block static-members

0
推荐指数
1
解决办法
371
查看次数