我正在阅读http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-137265.html#587的 Java 代码约定。
其中,他们提到我们应该避免使用对象来访问类变量或方法,而应该使用类名。
避免使用对象访问类(静态)变量或方法。请改用类名。例如:
Run Code Online (Sandbox Code Playgroud)classMethod(); //OK AClass.classMethod(); //OK anObject.classMethod(); //AVOID!
在术语、性能或其他方面是否有特殊原因?
假设我有一个类 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。
我想知道是否有适当的方法可以做到这一点。
举个例子:
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) 比较以下内容:
我在一个类中有一个静态成员,要么是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) 我想更好地理解OOP中的基本概念.面向对象编程中的静态和动态变量和方法是什么?例如,使用$ this与双冒号(::)之间的区别是什么?
$this->method_from_an_extended_class().我有一个应用程序,其中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地址,或者在极端情况下突然以不同的用户身份登录?
或者我应该重写代码并将其更改为 …
我有一个抽象的基类
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) 我有一个函数,应该只为class.i的所有实例运行一次.我想使用静态函数调用方法.所有Web示例都显示静态函数在Header文件(类内)中定义.我的功能很大我无法在头文件中定义我该怎么办?为了那个原因.
我应该在头文件中指定我的类级静态常量?
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文件和定义中. - 我已经知道了.
我看了这个问题而且很困惑.他使用静态块.他为什么要写一行?
这两者有什么区别?
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) static-members ×10
c++ ×5
java ×3
class ×2
constructor ×2
inheritance ×2
arrays ×1
c# ×1
c++17 ×1
constants ×1
constexpr ×1
dynamic ×1
jetty ×1
oop ×1
php ×1
servlets ×1
static ×1
static-block ×1